Настройка pcolormesh matplotlib
Есть данные в excel (data25.xls), на их основе пытаюсь построить график. Выходит не очень красиво... Т.е. Поскольку максимальное значение 2969 и оно быстро падает, то вся цветовая сетка около максимального значения (saved_figure.png) и в основном весь график синий, что не есть хорошо...
График строю так:
import xlwings as xw
import matplotlib.pyplot as plt
def get_row_col_index(sheet):
'Индексы для диапазона что бы забрать данные'
row = 0
col = 0
# find col
for i in range(1, 5000):
val = sheet.range((1, i)).value
if val == None:
col = (1, i - 1)
break
# find row
for i in range(1, 5000):
val = sheet.range((i, 1)).value
if val == None:
row = (i - 1, 1)
break
return row, col
def get_data_in_excel(row: tuple, col: tuple) -> list:
val = sheet.range((2, 2), (row[0], col[1])).options(
ndim=2).value # с 2 - т.к. нужно ислючить размерность длины по X, Y
return val
wb = xw.Book(f'data25.xls')
sheet = wb.sheets['Лист1']
row, col = get_row_col_index(sheet)
val = get_data_in_excel(row, col)
plt.imshow(val, cmap='jet', interpolation = 'bicubic', vmax=0.5)
plt.show()
# plt.savefig('saved_figure.png')
А хочется получить примерно это:

Данные: ссылка на excel
PS. Желаемый график получен из другой программы на основе тех же данных excel.
Ответы (1 шт):
Ваш код подготовки данных можно сократить до пары строчек. Но вот дальше с самой картинкой как-то не очень получается пока что вы хотите. Я ещё подумаю.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
df = pd.read_excel('data25.xls')
val = df.values[:,1:].T
val[val < 1e-3] = 0.04
plt.figure(figsize=(10,10))
plt.imshow(val, cmap='jet', interpolation = 'bicubic', vmax=0.1)
plt.show()
# plt.savefig('saved_figure.png')
Данные у вас на самом деле не совсем такие, как кажется. Например, их можно представить ещё так при помощи логарифмирования:
df = pd.read_excel('data25.xls')
val = df.values[:,1:].T
shift = val[val>0].min()
val = np.log(val + shift)
plt.figure(figsize=(10,10))
plt.imshow(val, cmap='magma', interpolation = 'bicubic', vmax=0.5)
plt.show()
Update Вариант с контурами:
plt.figure(figsize=(10,10))
plt.imshow(val, cmap='jet', interpolation = 'bicubic', vmax=0.1)
X, Y = np.meshgrid(range(df.shape[1]), range(df.shape[0]-1))
Z = val
plt.contour(X, Y, Z, sorted([2**(-n) for n in range(10)]));
plt.show()



