如何让单列子图中的折线图与热力图左右轴脊对齐
如何让单列子图中的折线图与热力图左右轴脊对齐
我来帮你解决这个对齐问题!首先得理清你代码里的两个关键问题,再一步步调整布局:
问题1:热力图覆盖了原有的子图轴
你现在写的 ax2 = sns.heatmap(...) 会重新创建一个新的轴对象,把一开始通过 subplots 创建的 ax2 给覆盖了,这直接打破了两个子图的布局关联,自然没法对齐。所以第一步要修正这个:绘制热力图时指定使用已有的ax2轴,代码改成这样:
sns.heatmap(ddf, linewidth=1, cmap='Blues', annot=True, robust=True, fmt='d', ax=ax2)
问题2:用width_ratios报错的原因
你设置的是2行1列的子图布局(subplots(2, ...) 里第一个参数是行数,默认列数为1),width_ratios 的长度必须和列数保持一致(也就是只能传一个值),传[2,1]自然会报错,因为列数不匹配。
解决方案:共享x轴实现完美对齐
最直接的方法是让两个子图共享x轴,这样它们的左右边界会自动对齐,而且x轴范围完全一致。具体操作分两步:
- 创建子图时开启共享x轴:
fig, (ax1, ax2) = plt.subplots(2, figsize=(25,10), gridspec_kw={'height_ratios': [1, 3]}, sharex=True)
- 保持你原来的折线图x轴隐藏逻辑:
ax1.axes.get_xaxis().set_ticks([])
这样设置后,折线图的x轴范围会和热力图完全匹配,左右边脊自然就对齐了,观众能直观对应每个月份的汽油价格和地铁客流量的关系。
额外适配:如果折线图是每日数据
如果你的eu_gas是2022年的每日汽油价格数据,那可以把日期转换成对应月份的序号(1月=0,12月=11),让折线图的x轴和热力图的x轴刻度一一对应:
# 提取日期对应的月份序号(减去1是为了和热力图x轴的0-11范围匹配) x_months = eu_gas.index.month - 1 ax1.plot(x_months, eu_gas['Unleaded Gasoline 95'])
最后别忘了加上plt.tight_layout()来优化子图间距,让整体布局更美观~
备注:内容来源于stack exchange,提问作者milikest
相关产品推荐
相关产品推荐

