如何使Seaborn热力图子图间的单元格尺寸保持一致?
如何让Seaborn热力图子图的单元格尺寸一致?
这个问题的核心是让两个子图的高度和各自的行数成比例,再结合sharex=True保证宽度一致,这样每个单元格的宽高就能完全匹配了。
具体做法很简单,我们可以通过gridspec_kw参数给两个子图设置高度比例,比例值就是各自数据的行数之比。修改后的代码如下:
import matplotlib.pyplot as plt import seaborn as sns # 定义两个数据集 data_a = [ [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0], ] data_b = [ [0,0,0], [0,0,0], [0,0,0], ] # 计算行数比例,用来设置子图高度 row_ratio = [len(data_a), len(data_b)] fig, axes = plt.subplots(2, 1, sharex=True, figsize=(5,10), gridspec_kw={'height_ratios': row_ratio}) # 绘制热力图 sns.heatmap(data_a, ax=axes[0], linewidths=0.2, cbar=False) sns.heatmap(data_b, ax=axes[1], linewidths=0.2, cbar=False) # 设置标题 axes[0].set_title("A") axes[1].set_title('B') plt.tight_layout() plt.show()
原理说明:
- 默认情况下,
plt.subplots(2,1)会把整个图的高度平均分给两个子图,这就导致行数多的子图A的单元格高度更小,行数少的子图B单元格高度更大。 - 我们通过
height_ratios设置子图高度为7:3(对应data_a的7行和data_b的3行),这样每个子图的高度除以自身行数后,得到的单元格高度是完全一致的。 - 加上
sharex=True保证了两个子图的宽度相同,所以每个单元格的宽度也一致,最终实现了跨子图的单元格尺寸统一,同时子图A也会因为行数多而整体更大,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Mitchell van Zuylen
相关产品推荐
相关产品推荐

