Настройка 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')

Получаю: res

А хочется получить примерно это: желаемое

Данные: ссылка на excel

PS. Желаемый график получен из другой программы на основе тех же данных excel.


Ответы (1 шт):

Автор решения: CrazyElf

Ваш код подготовки данных можно сократить до пары строчек. Но вот дальше с самой картинкой как-то не очень получается пока что вы хотите. Я ещё подумаю.

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()

введите сюда описание изображения

→ Ссылка