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

使用matplotlib.pyplot.subplots创建两个lag_plot时子图显示异常的修复方法

修复Matplotlib Subplots中Lag Plot重叠绘制的问题

问题场景

我尝试用matplotlib.pyplot.subplots创建上下排列的两个子图,分别绘制微软(MSFT)收盘价和标普500指数的滞后图(lag_plot),但运行代码后出现异常:两个滞后图都重叠在了同一个子图里,原本应该显示第一个图的区域是空的。我的代码如下:

# 1. 抓取数据
import pandas_datareader.data as web
import pandas as pd
import matplotlib.pyplot as plt
from datetime import date

# 起始日期
start = f"{date.today().year-3}-{date.today().month}-{date.today().day}"
# 结束日期
end = date.today()
# 'MSFT'数据
MSFT = pd.DataFrame(web.DataReader('MSFT' , start=start , end=end ,data_source='yahoo')['Close'])
# '标普500'数据
s_and_p500 = pd.DataFrame(web.DataReader('sp500' , start=start , end=end ,data_source='fred'))

# 2. 绘图
fig , (ax1 , ax2) = plt.subplots(2,1)
fig.set_figheight(4)
fig.set_figwidth(20)
ax1 = pd.plotting.lag_plot(MSFT['Close'])
ax2 = pd.plotting.lag_plot(s_and_p500['sp500'])

解决方案

问题的核心是你没有指定lag_plot的绘制目标子图,导致它自动创建新的Axes对象并覆盖了你原本的子图引用。只需要在lag_plot中通过ax参数指定预先创建好的子图即可,修正后的绘图代码如下:

# 修正后的绘图代码
fig , (ax1 , ax2) = plt.subplots(2,1)
fig.set_figheight(4)
fig.set_figwidth(20)
# 指定ax参数,将lag_plot绘制到对应的子图中
pd.plotting.lag_plot(MSFT['Close'], ax=ax1)
pd.plotting.lag_plot(s_and_p500['sp500'], ax=ax2)

# 可选:添加子图标题,让图表更清晰
ax1.set_title('MSFT Close Price Lag Plot')
ax2.set_title('S&P 500 Lag Plot')

# 调整子图间距,避免标题和图表重叠
plt.tight_layout()
plt.show()

原因说明

  • 当你执行fig, (ax1, ax2) = plt.subplots(2,1)时,已经生成了两个空白的子图Axes对象,ax1和ax2分别指向这两个子图。
  • 默认情况下,pd.plotting.lag_plot()会创建一个新的Axes对象并返回它,这就导致你原来的ax1和ax2被新的对象覆盖,原本的空白子图被闲置,两个滞后图最终都绘制在了最后创建的那个Axes上。
  • 通过显式传递ax=ax1和ax=ax2,就能强制lag_plot将图形绘制到你预先定义好的子图中,完美解决重叠问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 01:49:04