Python 如何在一个图形中创建多个共享图例的seaborn热图?

Python 如何在一个图形中创建多个共享图例的seaborn热图?,python,seaborn,Python,Seaborn,我想在一个图中创建多个(此处:两个)seaborn热图,其中热图具有不同的值范围,但应包含一个共享图例 以下代码在一个图形中创建两个热图,但两个图的颜色编码不同 导入seaborn作为sns 将matplotlib.pyplot作为plt导入 作为pd进口熊猫 df=pd.DataFrame(np.random.random((4,4))) df2=pd.DataFrame([1、.5、.9、.6]) 图,ax=plt.子批次(ncols=2,sharey=True) sns_g=sns.hea

我想在一个图中创建多个(此处:两个)seaborn热图,其中热图具有不同的值范围,但应包含一个共享图例

以下代码在一个图形中创建两个热图,但两个图的颜色编码不同

导入seaborn作为sns
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
df=pd.DataFrame(np.random.random((4,4)))
df2=pd.DataFrame([1、.5、.9、.6])
图,ax=plt.子批次(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])
#图子批次调整(右=0.6)
#cbar_ax=图添加轴([1.1,0.15,0.05,77])
#图颜色条(ax[1],cax=cbar\u ax)
plt.紧_布局()
plt.show()

我在sns_g中加入了cbar=True,只是为了表明这两个图例代表不同的范围。我想要显式地创建两个绘图。

fig.colorbar
想要一个
ScalarMappable
对象,而不是
。但是seaborn的API让你不用担心

根据我在seaborn.pydata.org中搜索“热图”发现的its,函数签名是:

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
传递给另一个热图

如果要手动创建颜色条,可以在网格中为其保留一个轴。使用
vmin
vmax
指定限制,并使用其中一个热图(例如
axs[0].集合[0]
)作为可缩放的输入,输入到
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()

高度相关:@ImportanceOfBeingErnest:谢谢您的推荐。但是,我不确定在这种情况下如何添加颜色映射。如果我取消对代码中的行的注释,我会得到:AttributeError:'AxesSubplot'对象没有属性'autoscale\u None'