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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:32:41