使用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
相关产品推荐
相关产品推荐

