Seaborn heatmaps в subplots - подравняване на оста x

Опитвам се да начертая фигура, съдържаща два подграфика, морска топлинна карта и прости линии на matplotlib. Въпреки това, когато се споделя оста x за двата графика, те не се подравняват, както може да се види на тази фигура:

фигура

Изглежда, че проблемът е подобен на тази публикация, но при показване на ax[0].get_xticks() и ax[1].get_xticks() получавам същите позиции, така че не знам какво да променя. И на моята снимка отклонението изглежда е повече от 0,5 промяна.

какво правя грешно

Кодът, който използвах, за да начертая фигурата, е следният:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

M_1=np.random.random((15,15))
M_2=np.random.random((15,15))

L_1=np.random.random(15)
L_2=np.random.random(15)

x=range(15)

cmap = sns.color_palette("hot", 100)
sns.set(style="white")

fig, ax  = plt.subplots(2, 1, sharex='col', figsize=(10, 12))

ax[0].plot(x,L_1,'-', marker='o',color='tab:orange')
sns.heatmap(M_1, cmap=cmap, vmax=np.max(M_1), center=np.max(M_1)/2., square=False, ax=ax[1])

person lfo-po    schedule 27.11.2020    source източник
comment
Можете да го подравните, като използвате cbar=False в кода на топлинната карта.   -  person r-beginners    schedule 27.11.2020
comment
Предполагам, че цветната лента е доста важна. Какво ще кажете за създаването на gridspec pattern, който разделя долния поддиплом в област за топлинната карта и по-малка област, определена за цветната лента, след което начертайте цветната лента в това определено осево пространство, като използвате параметъра cbar_ax на топлинната карта?   -  person Mr. T    schedule 27.11.2020


Отговори (1)


Коментарът на @Mr-T е на място. Най-лесно би било да създадете осите предварително, вместо да оставите heatmap() да свие вашите оси, за да освободи място за цветната лента.

Има допълнително усложнение, че етикетите за топлинната карта всъщност не са поставени на [0,1,...], а са в средата на всяка клетка на [0,5, 1,5, ...]. Така че, ако искате горната ви графика да се изравни с етикетите в долната част (и с центъра на всяка клетка), може да се наложи да преместите графиката си с 0,5 единици надясно:

M_1=np.random.random((15,15))
M_2=np.random.random((15,15))
L_1=np.random.random(15)
L_2=np.random.random(15)
x=np.arange(15)

cmap = sns.color_palette("hot", 100)
sns.set(style="white")

fig, ax  = plt.subplots(2, 2, sharex='col', gridspec_kw={'width_ratios':[100,5]})
ax[0,1].remove()  # remove unused upper right axes
ax[0,0].plot(x+0.5,L_1,'-', marker='o',color='tab:orange')
sns.heatmap(M_1, cmap=cmap, vmax=np.max(M_1), center=np.max(M_1)/2., square=False, ax=ax[1,0], cbar_ax=ax[1,1])

въведете описание на изображението тук

person Diziet Asahi    schedule 27.11.2020