Как создать несколько тепловых карт морского происхождения с общей легендой на одной фигуре? - PullRequest
0 голосов
/ 06 июня 2019

Я хочу создать несколько (здесь: две) тепловых карт морского происхождения на одном рисунке, где тепловые карты имеют разные диапазоны значений, но должны содержать одну общую легенду.

Следующий код создает две тепловые карты на одной фигуре, но цветовая кодировка для двух графиков различна.

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

df = pd.DataFrame(np.random.random((4,4)))
df2 = pd.DataFrame([1., .5, .9, .6])

fig, ax = plt.subplots(ncols=2, sharey=True)

sns_g = sns.heatmap(df, annot=True, yticklabels=True, ax=ax[0])
sns_g2 = sns.heatmap(df2, annot=True, cbar=False, ax=ax[1])

# fig.subplots_adjust(right=0.6)
# cbar_ax = fig.add_axes([1.1, 0.15, 0.05, .77])
# fig.colorbar(ax[1], cax=cbar_ax)

plt.tight_layout()

plt.show()

Я включил cbar = True в sns_g только для того, чтобы показать, что две легенды представляют разные диапазоны. Я хочу явно создать два сюжета.

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Если вы хотите создать цветовую панель вручную, вы можете сохранить для нее оси в сетке.Используйте vmin и vmax для определения пределов и используйте одну из тепловых карт (например, axs[0].collections[0]) в качестве входных данных ScalarMappable для fig.colorbar.

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

df = pd.DataFrame(np.random.random((4,4)))
df2 = pd.DataFrame([1., .5, .9, .6])

vmin = min(df.values.min(), df2.values.min())
vmax = max(df.values.max(), df2.values.max())

fig, axs = plt.subplots(ncols=3, gridspec_kw=dict(width_ratios=[4,1,0.2]))

sns.heatmap(df, annot=True, cbar=False, ax=axs[0], vmin=vmin)
sns.heatmap(df2, annot=True, yticklabels=False, cbar=False, ax=axs[1], vmax=vmax)

fig.colorbar(axs[1].collections[0], cax=axs[2])

plt.show()

enter image description here

0 голосов
/ 06 июня 2019

fig.colorbar хочет объект ScalarMappable, а не Axes. Но API Seaborn позволяет вам не беспокоиться об этом.

В соответствии с документами , которые я нашел, выполнив поиск по "heatmap" в seaborn.pydata.org, сигнатура функции:

seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None,
                robust=False, annot=None, fmt='.2g', annot_kws=None, 
                linewidths=0, linecolor='white', cbar=True, cbar_kws=None, 
                cbar_ax=None, square=False, xticklabels='auto',
                yticklabels='auto', mask=None, ax=None, **kwargs)

Таким образом, все, что вам нужно сделать, это передать одинаковые значения vmin и vmax в обе тепловые карты, но передать cbar=False и cbar=True другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...