我想在一个图中创建多个(此处:两个)seaborn 热图,其中热图具有不同的值范围,但应包含一个共享的图例。
以下代码在一个图中创建了两个热图,但两个图的颜色编码不同。
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()
Run Code Online (Sandbox Code Playgroud)
我在 sns_g 中包含 cbar=True 只是为了表明两个图例代表不同的范围。我想明确创建两个图。
Imp*_*est 11
如果您想手动创建颜色条,您可以在网格中为其保留一个轴。使用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()
Run Code Online (Sandbox Code Playgroud)
fig.colorbar想要一个ScalarMappable对象,而不是一个Axes。但seaborn的API让你不用担心这个问题。
根据我通过在seaborn.pydata.org中搜索“heatmap”找到的文档,函数签名是:
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)
Run Code Online (Sandbox Code Playgroud)
因此,您需要做的就是将相同的vmin和vmax值传递给两个热图,但将cbar=False, 和传递cbar=True给另一个热图。
| 归档时间: |
|
| 查看次数: |
7112 次 |
| 最近记录: |