Перекрытие чисел на цветовой панели при использовании подзаголовка и тепловой карты

#python #matplotlib #heatmap #colorbar

#python #matplotlib #тепловая карта #цветная панель

Вопрос:

Перекрытие двух тепловых карт
Еще два с одинаковым уровнем цвета тепловых карт

Уровень всех четырех тепловых карт фиксирован и одинаков. Но поскольку данные разные, значения max и min разные. Затем появляется перекрытие индекса цвета. Я пытался изменить уровень тепловой карты, но не работает.

Вот код:

 fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_size_inches(16.5, 5.5)

X1 = np.linspace(1950, 2035, 86)
Y1 = np.linspace(20, 95, 76)
X1,Y1 = np.meshgrid(X1,  Y1)
Z1 = F_proj_SOA17.iloc[20:-5,4:]
norm = mcolors.TwoSlopeNorm(vmin=(Z1.to_numpy()).min(), vmax = (Z1.to_numpy()).max(), vcenter=0)
level = np.arange(-0.07, 0.07, 0.003)
DV = ax1.contourf(X1,Y1,Z1,level,cmap=plt.cm.RdBu_r, extend='both', norm=norm)
ax1.set_title('MIR 1951-2035 for Female (SOA17)')
ax1.xaxis.set_ticks(np.arange(1960, 2036, 20))
ax1.axvline(x=2016, c = 'black', linestyle = ':')
fig.colorbar(DV, ax=ax1)

X2 = np.linspace(1950, 2036, 87)
Y2 = np.linspace(20, 95, 76)
X2,Y2 = np.meshgrid(X2,  Y2)
Z2 = F_proj_DV18.iloc[20:-5,4:]
norm = mcolors.TwoSlopeNorm(vmin=(Z2.to_numpy()).min(), vmax = (Z2.to_numpy()).max(), vcenter=0)
level = np.arange(-0.07, 0.07, 0.003)
MP = ax2.contourf(X2,Y2,Z2,level,cmap=plt.cm.RdBu_r, extend='both', norm=norm)
ax2.set_title('MIR 1951-2036 for Female (SOA17HMD18)')
ax2.xaxis.set_ticks(np.arange(1960, 2036, 20))
ax2.axvline(x=2016, c = 'black', linestyle = ':')
ax2.axvline(x=2017, c = 'black', linestyle = ':')
fig.colorbar(MP, ax=ax2)

plt.show()
  

Комментарии:

1. Не могли бы вы добавить полный код для создания минимально воспроизводимого примера? Кроме того, при создании тепловых карт вы можете установить vmin= и vmax= на одно и то же значение для каждого из подзаголовков.

2. @JohanC Я добавил полный код. и я уже использовал vmin и vmax. Но я не знаю, почему происходит перекрытие индекса.

3. Вы могли бы установить vmin=min(Z1.min(), Z2.min()) для обоих графиков, чтобы они были равны. Поскольку значения почти симметричны нулю, вы также можете заменить TwoSlopeNorm простой нормой, установив для vmin и vmax один и тот же абсолютный максимум с разными знаками. Можно использовать простой подход norm=plt.Normalize(-0.07,0.07) , который также упростил бы сравнение разных графиков.

4. @JohanC Я попробовал plt. Нормализуйте (-0.07, 0.07), и это работает хорошо! снова перекрытия нет, хотя цвет изменился немного светлее. Большое спасибо за вашу помощь!