Python Subplot仅显示底部绘图,顶部子图空白问题求助
解决Python绘图中子图空白的问题
我来帮你搞定这个绘图问题!你遇到的核心问题是错误地重新赋值了子图轴对象,导致xarray的plot方法没有在你预期的子图上绘图。
问题原因分析
你原来的代码里写了ax1 = ax1.plot(...)这类语句——但xarray的plot()方法返回的是绘图相关的对象(比如颜色条、图层实例等),并非子图轴对象。当你把这个返回值重新赋值给ax1时,就直接覆盖了plt.subplots()创建的顶部子图轴,导致后续绘图逻辑完全混乱:最终ax1的数据被画到了新生成的临时轴(底部区域),而原本的顶部子图ax2根本没被使用,所以呈现空白状态。
修正后的代码
正确的做法是在xarray的plot()方法中通过ax=参数指定要绘图的子图轴,绝对不要重新赋值ax1/ax2变量:
import matplotlib.pyplot as plt import matplotlib.cm as cm import numpy as np # 假设你已导入xarray及相关数据集 fig, (ax1, ax2) = plt.subplots(2, sharex=True) fig.suptitle('Sea Surface pCO2 (ppmv)') # 在顶部子图ax1上绘制数据 interp_bathy.where(interp_bathy > 0).plot( ax=ax1, cmap=cm.topo, vmin=-4000, vmax=4000, add_colorbar=False ) interp_pco2_pre.where(interp_bathy > -120).where(interp_bathy < 0).plot( ax=ax1, levels=np.arange(200, 501, 10), cmap=cm.thermal, cbar_kwargs={'label': 'Sea surface pCO2 (ppmv)'} ) # 在底部子图ax2上绘制数据 interp_bathy.where(interp_bathy > 0).plot( ax=ax2, cmap=cm.topo, vmin=-4000, vmax=4000, add_colorbar=False ) interp_pco2_pd.where(interp_bathy > -120).where(interp_bathy < 0).plot( ax=ax2, levels=np.arange(200, 501, 10), cmap=cm.thermal, cbar_kwargs={'label': 'Sea surface pCO2 (ppmv)'} ) plt.tight_layout() plt.show()
关键注意点
- 保留
plt.subplots()创建的ax1/ax2子图轴对象,永远不要用plot的返回值覆盖它们 - 每次调用xarray的
plot()时,通过ax=ax1或ax=ax2明确指定目标子图,避免自动生成新轴 - 最后加上
plt.tight_layout()可以优化子图布局,防止标题和子图元素重叠
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

