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

Matplotlib绘制2行1列子图仅显示下方子图如何解决?

问题根因

问题核心是pandas的DataFrame.plot()方法默认会创建新的坐标轴实例,没有复用你预先声明的子图:

  • 当你只绘制单列(Series)时,pandas会自动复用当前活跃的坐标轴,所以两个子图都能正常显示
  • 当你绘制整个DataFrame时,pandas会新建独立的坐标轴,覆盖之前的子图布局,最终只会显示最后一次绘制的子图

修正方案

直接捕获plt.subplots()返回的两个子图对象,调用plot()时通过ax参数指定绘制的目标子图即可,修正后代码如下:

import matplotlib.pyplot as plt
import pandas as pd

# 创建2行1列的子图,直接获取两个子图对象,设置sharex=True实现X轴共享
fig, (ax1, ax2) = plt.subplots(2, 1, figsize = [10, 15], sharex=True) 

# 第一个DataFrame绘制到上层子图ax1
df1.plot(ax=ax1, grid=True, title='Some Title', legend=True)
ax1.set_ylim(0,1)
ax1.set_ylabel('Win Probabilities')
ax1.legend(title="Risk Reward Ratios", fancybox=True)

# 第二个DataFrame绘制到下层子图ax2
df2.plot(ax=ax2, grid=True, legend=True)
ax2.set_ylabel('Expected Returns')
ax2.legend(title="Risk Reward Ratios", fancybox=True)

plt.savefig('fig.png')
plt.close()

关键修改点说明

  • 提前声明子图时就通过sharex=True开启X轴共享,不需要在plot方法中重复设置
  • 每个df.plot()都传入对应的ax参数,强制指定绘制的目标子图,避免pandas自动新建坐标轴
  • 统一用ax对象的方法设置坐标轴属性,比混用pyplot的plt.类方法更稳定,不会出现子图指向错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:21:03