You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GridSpec子图布局共享轴时X轴标签覆盖及刻度异常问题求助

解决GridSpec布局下热力图与辅助柱状图的刻度混乱问题

需要实现的子图布局:

  • 主图:基于Pandas DataFrame的Seaborn热力图(索引为变量名,列为日期)
  • 上方子图:按日期维度的计数柱状图(统计每日有值的变量数量)
  • 右侧子图:按变量维度的计数柱状图(统计每个变量在所有日期中的有值次数)
    要求仅主图显示坐标轴,X轴标注年份、Y轴标注变量名,但现有代码出现刻度混乱问题。

生成数据(保留原逻辑)

from random import randrange
import pandas as pd
import numpy as np

xnobs = 120
ynobs = 10

tmp = pd.DataFrame(np.nan, index=['V'+str(i) for i in range(ynobs)], columns=pd.date_range(start='1/1/2018', periods=xnobs))
for _ in range(xnobs*ynobs*2):
    tmp.iloc[randrange(0, ynobs), randrange(0, xnobs)] = np.abs(np.random.randn())

修正后的绘图代码

import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.cm as cm  # 补充缺失的导入

title = ''
ypos = 0.885

fig = plt.figure(figsize=(10, 10))
fig.tight_layout(rect=[0, 0.03, 1, 0.95])
fig.suptitle(title, y=ypos, fontsize=12)

# GridSpec布局:12行12列,主图占中间区域,上方子图占第一行,右侧子图占最后两列
grid = plt.GridSpec(12, 12, hspace=0.2, wspace=0.5)
main_ax = fig.add_subplot(grid[1:-1, :-2])
y_hist = fig.add_subplot(grid[1:-1, -2:], sharey=main_ax)
x_hist = fig.add_subplot(grid[0, :-2], sharex=main_ax)

# 绘制热力图:禁用自动刻度调整,避免覆盖手动设置
g = sns.heatmap(tmp, cmap=cm.Reds, cbar=False, ax=main_ax, xticklabels=False, yticklabels=False)

# 绘制上方日期计数柱状图:隐藏刻度,匹配主图X轴范围
tmp.count(axis=0).plot.bar(ax=x_hist, width=1, align='edge', color='darkred')
x_hist.set_xticks([])
x_hist.set_yticks([])

# 绘制右侧变量计数柱状图:隐藏Y轴刻度,反转Y轴匹配热力图顺序
tmp.count(axis=1).plot.barh(ax=y_hist, width=1, align='edge', color='darkred')
y_hist.set_yticks([])
y_hist.invert_yaxis()

# 配置主图Y轴:显示变量名,每个刻度对应一行
main_ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
main_ax.set_yticklabels(tmp.index.tolist(), rotation=0)

# 配置主图X轴:标注年份,定位到每年第一个月份的位置
year_starts = [i for i, col in enumerate(tmp.columns) if col.month == 1]
# Heatmap的X轴刻度实际位于每列中间,给年份起始索引加0.5确保对齐
main_ax.set_xticks([pos + 0.5 for pos in year_starts])
main_ax.set_xticklabels([tmp.columns[y].year for y in year_starts], rotation=45)

plt.show()

关键修正点说明

  • 补充缺失导入:添加matplotlib.ticker和matplotlib.cm的导入,避免运行报错
  • 热力图禁用自动刻度:绘制heatmap时设置xticklabels=False, yticklabels=False,防止Seaborn自动生成的刻度覆盖手动配置
  • Y轴标签修正:移除原代码中多余的空字符串,直接使用变量名列表作为刻度标签
  • X轴刻度位置调整:Heatmap的X轴刻度实际位于每列中间(即0.5, 1.5,...),给年份起始索引加0.5确保标签对齐到年份起始列的中间
  • 辅助图刻度隐藏:直接隐藏上方和右侧子图的所有刻度,避免共享轴导致的刻度干扰
  • 共享轴保留:保留sharex和sharey,确保辅助图与主图的轴范围完全匹配,保证布局对齐

内容的提问来源于stack exchange,提问作者Thomasius Wa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:34:56