子图中 seaborn 热图的一个颜色条
One colorbar for seaborn heatmaps in subplot
这是一个显示每个子图的颜色条的示例:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random((10,10,)))
fig,axn = plt.subplots(2, 2, sharex=True, sharey=True)
for ax in axn.flat:
sns.heatmap(df, ax=ax)
如何删除每个子图的颜色条?我希望只有一个垂直或水平方向的颜色条。我知道我可以通过 fig.get_axes()[:-4]
访问每个颜色条轴,但我怎样才能将它从绘图中完全删除?我认为在调用热图时没有选择不绘制颜色条的选项。
cbar
参数控制是否应该添加颜色条,cbar_ax
参数可以选择指定颜色条应该去的轴。所以,你可以这样做:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random((10,10,)))
fig, axn = plt.subplots(2, 2, sharex=True, sharey=True)
cbar_ax = fig.add_axes([.91, .3, .03, .4])
for i, ax in enumerate(axn.flat):
sns.heatmap(df, ax=ax,
cbar=i == 0,
vmin=0, vmax=1,
cbar_ax=None if i else cbar_ax)
fig.tight_layout(rect=[0, 0, .9, 1])
(你会在这里收到关于 tight_layout
的警告,但它实际上是正确的,因为我们明确地放置了 cbar_ax
。如果你不喜欢看到警告,你也可以调用 tight_layout
在绘图之前,但它不会那么紧)。
实际上没有必要为前3个子图设置cbar_ax
到none。您可以为所有 4 个子图设置 cbar_ax=cbar_ax
,它只会在完全相同的位置绘制颜色条 4 次,这根本不会影响外观。
这对那些使用 FacetGrid 的人来说效果更好,例如给定一个数据框 df
:
def draw_heatmap(*args, **kwargs):
data = kwargs.pop('data')
d = data.pivot(index=args[1], columns=args[0], values=args[2])
sns.heatmap(d, **kwargs)
g = sns.FacetGrid(df, col='col_name', col_wrap=2, margin_titles=True, sharey=True)
cbar_ax = g.fig.add_axes([.91, .15, .03, .7])
g = g.map_dataframe(draw_heatmap, 'col_col', 'index_col', 'val_col', annot=True,
cmap='Spectral', cbar_ax=cbar_ax, cbar_kws={'label': 'color_bar_label'})
这是一个显示每个子图的颜色条的示例:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random((10,10,)))
fig,axn = plt.subplots(2, 2, sharex=True, sharey=True)
for ax in axn.flat:
sns.heatmap(df, ax=ax)
如何删除每个子图的颜色条?我希望只有一个垂直或水平方向的颜色条。我知道我可以通过 fig.get_axes()[:-4]
访问每个颜色条轴,但我怎样才能将它从绘图中完全删除?我认为在调用热图时没有选择不绘制颜色条的选项。
cbar
参数控制是否应该添加颜色条,cbar_ax
参数可以选择指定颜色条应该去的轴。所以,你可以这样做:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random((10,10,)))
fig, axn = plt.subplots(2, 2, sharex=True, sharey=True)
cbar_ax = fig.add_axes([.91, .3, .03, .4])
for i, ax in enumerate(axn.flat):
sns.heatmap(df, ax=ax,
cbar=i == 0,
vmin=0, vmax=1,
cbar_ax=None if i else cbar_ax)
fig.tight_layout(rect=[0, 0, .9, 1])
(你会在这里收到关于 tight_layout
的警告,但它实际上是正确的,因为我们明确地放置了 cbar_ax
。如果你不喜欢看到警告,你也可以调用 tight_layout
在绘图之前,但它不会那么紧)。
实际上没有必要为前3个子图设置cbar_ax
到none。您可以为所有 4 个子图设置 cbar_ax=cbar_ax
,它只会在完全相同的位置绘制颜色条 4 次,这根本不会影响外观。
这对那些使用 FacetGrid 的人来说效果更好,例如给定一个数据框 df
:
def draw_heatmap(*args, **kwargs):
data = kwargs.pop('data')
d = data.pivot(index=args[1], columns=args[0], values=args[2])
sns.heatmap(d, **kwargs)
g = sns.FacetGrid(df, col='col_name', col_wrap=2, margin_titles=True, sharey=True)
cbar_ax = g.fig.add_axes([.91, .15, .03, .7])
g = g.map_dataframe(draw_heatmap, 'col_col', 'index_col', 'val_col', annot=True,
cmap='Spectral', cbar_ax=cbar_ax, cbar_kws={'label': 'color_bar_label'})