как изменить масштаб оси y, чтобы лучше видеть в тепловой карте

#python #matplotlib #heatmap #imshow

#python #matplotlib #тепловая карта #imshow

Вопрос:

В настоящее время у меня проблема с масштабированием тепловой карты:

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

Как вы можете видеть в начале и в конце, есть изменение температуры, но поскольку это делается на очень маленьком расстоянии, а масштаб большой, мы вообще ничего не видим.

Итак, есть ли способ или функция для решения этой проблемы и автоматического применения лучшего масштаба, чтобы лучше видеть? Применять малый масштаб там, где есть вариации, и большой масштаб, когда его нет?

Вот код для создания этого изображения :

 x = np.linspace(0,L,Nx 1) #array for y-axis
t = np.linspace(0.0, t_fin,Nt 1) #array to plot the time in the title

x = np.round(x,2) #change decimals 
t = np.round(t,5)


y = np.arange(T[Nt,:].shape[0]) #T[Nt,:] is an array that contains the temperature
my_yticks = x #change the number of points in the y-axis
frequency = 100


data = np.vstack(T[Nt,:]) #to use in imshow
df = pd.DataFrame(data)

fig = plt.figure(figsize=(3,9)) #plotting
titre = f"Température à {t[Nt]} s"
plt.ylabel('Profondeur en m')
plt.yticks(y[::frequency], my_yticks[::frequency])
im = plt.imshow(df, cmap='jet', aspect ='auto', interpolation='bilinear')
ax = plt.gca()
ax.get_xaxis().set_visible(False)
cb = plt.colorbar()
cb.set_label('Température en °C')
plt.title(titre)
 

Если у вас есть какие-либо вопросы, не стесняйтесь.

Спасибо!

Ответ №1:

Вы могли бы использовать logit масштаб по оси y. Однако это не сработает, imshow поскольку значения должны быть исключительно от 0 до 1. Вместо этого вы могли бы использовать a pcolormesh .

 import matplotlib.pyplot as plt
import numpy as np

M,N = 100,20
a = np.array(M*[15])
a[:3] = [0,5,10]
a[-3:] = [20,25,30]
a = np.outer(a, np.ones(N))

fig, (axl,axr) = plt.subplots(ncols=2, figsize=(3,6))

axl.imshow(a, cmap='jet', aspect ='auto', interpolation='bilinear', extent=(N,0,M,0))
axl.yaxis.set_ticklabels([f'{t/M*10:.3g}' for t in  axl.yaxis.get_ticklocs()])
axl.get_xaxis().set_visible(False)
axl.set_title('linear')

eps = 1e-3
X, Y = np.meshgrid(np.linspace(0, 1, N), np.linspace(1-eps, eps, M))
cm = axr.pcolormesh(X, Y, a, cmap='jet', shading='gouraud')
axr.set_yscale('logit')
axr.yaxis.set_ticklabels([f'{10*(1-t):.3g}' for t in  axr.yaxis.get_ticklocs()])
axr.get_xaxis().set_visible(False)
axr.set_title('logit')

cb = plt.colorbar(cm, pad=0.2)
 

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

Предупреждение: установка меток y в качестве фиксированных значений полезна только в том случае, если вы не хотите панорамировать / масштабировать изображение.

Ответ №2:

Вы можете установить ограничение оси y с помощью ax.set_ylim([,])