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

如何在循环中使用twinx绘制双Y轴图并避免生成多余空白画布

问题原因

  • 连续调用两次plt.subplots()会生成两个独立画布,第二次调用生成的画布没有绘制内容,就是你看到的多余空白画布
  • ax是存储所有子图的numpy数组,只有数组内的单个子图对象才支持twinx()方法,不能直接对整个数组调用该方法

修正后的代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

region_list = sorted(region['Area'].unique().tolist())

# 仅创建一次画布和子图数组即可
fig, ax = plt.subplots(nrows=len(region_list), figsize=(13.8,len(region_list)*7))

for i in region_list:
    ind = region_list.index(i)
    filt = region['Area'] == i
    # 循环内为当前单个子图创建双Y轴,不需要提前初始化ax2数组
    ax2 = ax[ind].twinx()
    ax[ind].plot(region.loc[filt]['Month'],region.loc[filt]['Flat'], color='red', marker='o')
    ax[ind].set_ylabel('Average price of flats', color='red', fontsize=14)
    ax2.plot(region.loc[filt]['Month'],region.loc[filt]['Detached'],color='blue',marker='o')
    ax2.set_ylabel('Average price of detached properties',color='blue',fontsize=14)
    ax[ind].set_title(i, size=14)
    ax[ind].xaxis.set_tick_params(labelsize=10)
    ax[ind].yaxis.set_tick_params(labelsize=10)
    # 补充第二个Y轴的刻度样式设置
    ax2.yaxis.set_tick_params(labelsize=10)

plt.tight_layout()
plt.show()

调整说明

  • 删除了第二次plt.subplots()调用,彻底避免生成多余空白画布
  • 不需要提前初始化ax2数组,在循环内为每个子图单独创建对应的双Y轴对象即可,不会出现NameError报错
  • 补充了右侧Y轴的刻度参数设置,和左侧Y轴样式保持统一

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:45:03