Pandas Series.plot()绘制非连续段堆叠而非衔接的问题
问题解答
这不是bug,是pandas版本迭代后的默认行为变化。
原因说明
你学习的Coursera课程使用的是2018-2019年的pandas版本(大概率是0.x系列),当时连续调用Series.plot()时,默认会在同一个绘图轴(Axes)上叠加绘制,所以两段时间区间的股价数据会自动分配不同颜色,形成连续的分段折线。
而pandas 1.5.2属于1.x系列版本,从1.x开始,plot()的默认行为调整为每次调用都会创建新的绘图轴。你两次调用plot()相当于生成了两个独立的画布,最终显示时两个画布重叠,就出现了数据堆叠、x轴标签重复的问题。
解决方法
方法1:指定同一个绘图轴
手动获取或创建一个Axes对象,在每次调用plot()时通过ax参数传入,强制在同一个画布上绘图:
import pandas as pd import matplotlib.pyplot as plt # 注意路径前加r避免转义字符问题 fb = pd.read_csv(r"C:\Users\me\Downloads\META.csv", index_col='Date') # 获取当前绘图轴 ax = plt.gca() # 两段数据都在同一个轴上绘制 fb.loc['2022-01-10':'2022-06-01', 'Close'].plot(ax=ax) fb.loc['2022-06-02':, 'Close'].plot(ax=ax) # 显示图像 plt.show()
方法2:合并分段数据后统一绘图
将两段数据合并为一个DataFrame,通过一次plot()完成绘制,pandas会自动为不同列分配颜色:
import pandas as pd fb = pd.read_csv(r"C:\Users\me\Downloads\META.csv", index_col='Date') # 为两段数据重命名,方便区分 segment1 = fb.loc['2022-01-10':'2022-06-01', 'Close'].rename('2022年初-年中') segment2 = fb.loc['2022-06-02':, 'Close'].rename('2022年中之后') # 合并后绘图 pd.concat([segment1, segment2], axis=1).plot()
补充说明
pandas 1.x调整plot()默认行为,是为了让单次绘图更独立,避免因多次调用意外污染同一个画布。这属于版本更新的特性,而非bug。
内容的提问来源于stack exchange,提问作者Tatiana Racheva
相关产品推荐
相关产品推荐

