如何在循环中使用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
相关产品推荐
相关产品推荐

