Seaborn子图热力图布局错位及色条标签位置调整求助
解决热力图对齐与色条标签布局问题
问题背景
现有两个DataFrame:
df1 = pd.DataFrame(np.random.randint(0,50,size=(5,5)), columns=list('ABCDE')) df2 = pd.DataFrame(np.random.randint(0,50,size=(5,5)), columns=list('FGHIJ'))
需求为:
- 并排绘制两个热力图,共用一个色条(数据范围一致)
- 将共用色条缩小至原尺寸的一半
- 色条标签移至色条右侧
- 解决当前代码中两个热力图不在同一水平高度的对齐问题
原代码存在布局偏移,且色条标签位置不符合要求。
修正方案
通过手动指定色条轴、使用网格布局来解决对齐问题,同时调整色条标签位置:
完整代码
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 创建数据 df1 = pd.DataFrame(np.random.randint(0,50,size=(5,5)), columns=list('ABCDE')) df2 = pd.DataFrame(np.random.randint(0,50,size=(5,5)), columns=list('FGHIJ')) # 创建画布与网格布局,预留色条区域 fig = plt.figure(figsize=(7, 5)) # 2行2列网格:第一行两个热力图,第二行跨列放色条 gs = fig.add_gridspec(2, 2, height_ratios=[10, 1], width_ratios=[1, 1], hspace=0.1) # 初始化热力图轴与色条轴 ax1 = fig.add_subplot(gs[0, 0]) ax2 = fig.add_subplot(gs[0, 1]) cbar_ax = fig.add_subplot(gs[1, :]) # 绘制第一个热力图,指定共用色条轴 sns.heatmap(df1, square=True, vmax=50, vmin=0, cmap=sns.color_palette("viridis", as_cmap=True), cbar=True, cbar_ax=cbar_ax, cbar_kws={'orientation': 'horizontal', 'shrink': 0.5}, ax=ax1) # 绘制第二个热力图,关闭独立色条 sns.heatmap(df2, square=True, vmax=50, vmin=0, cmap=sns.color_palette("viridis", as_cmap=True), cbar=False, ax=ax2) # 调整色条标签到右侧 cbar = cbar_ax.collections[0].colorbar cbar.set_label('Scale', labelpad=15, rotation=0) cbar.ax.yaxis.set_label_position('right') plt.tight_layout() plt.show()
关键调整说明
- 布局对齐:使用
gridspec划分固定网格,将两个热力图放在同一行的不同列,色条单独占一行并跨两列,避免了原代码中因第一个热力图自带色条导致的轴偏移问题,确保两个热力图水平对齐。 - 色条设置:通过
cbar_ax指定共用色条的位置,用shrink=0.5将色条缩小至原尺寸的一半。 - 标签位置调整:将色条标签旋转为水平(
rotation=0),并设置yaxis.set_label_position('right')把标签移到色条右侧,labelpad调整标签与色条的间距。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

