如何在Matplotlib中以datetime64[ns]类型的DataFrame列为X轴绘制时间序列
修正Matplotlib绘制双时间序列的问题
嘿,我帮你梳理下代码里的问题,以及怎么调整来实现同一张图里画Open和Close两个时间序列~
你的代码里的几个关键问题:
- 导入错误:你导入的是
matplotlib整个库,但绘图需要用它的pyplot子模块,直接用matplotlib调用xticks、plot这些方法会报错。 - X轴未正确指定:你想把Date列作为X轴,但代码里既没把它传给
plot函数,还写错了列名(你写的df['Index']应该是笔误,实际是Date列对吧?)。默认情况下,plt.plot(df['Close'])会用DataFrame的默认索引当X轴,而不是你需要的日期。 - 日期刻度可读性差:就算你指定了Date列,直接把所有日期塞给
xticks会导致刻度重叠,根本看不清。
修正后的完整代码
import matplotlib.pyplot as plt import pandas as pd # 假设你的DataFrame已经加载完成,且Date列是datetime64[ns]类型 # 方法1:将Date设为索引(推荐,绘图更简洁) df.set_index('Date', inplace=True) # 绘制两条时间序列,同时添加标签方便区分 plt.plot(df.index, df['Close'], label='Close Price') plt.plot(df.index, df['Open'], label='Open Price') # 处理日期刻度:自动旋转避免重叠,设置清晰的日期格式 plt.gcf().autofmt_xdate() date_formatter = plt.matplotlib.dates.DateFormatter('%Y-%m-%d') plt.gca().xaxis.set_major_formatter(date_formatter) # 添加图表元素,提升可读性 plt.legend() plt.title('Daily Open vs Close Prices') plt.xlabel('Date') plt.ylabel('Price') plt.show()
如果不想把Date设为索引,也可以直接在plot里指定X轴:
# 方法2:不修改索引,直接指定x参数 plt.plot(df['Date'], df['Close'], label='Close Price') plt.plot(df['Date'], df['Open'], label='Open Price') # 后面的日期格式化、图表元素设置和上面一样 plt.gcf().autofmt_xdate() date_formatter = plt.matplotlib.dates.DateFormatter('%Y-%m-%d') plt.gca().xaxis.set_major_formatter(date_formatter) plt.legend() plt.title('Daily Open vs Close Prices') plt.xlabel('Date') plt.ylabel('Price') plt.show()
关键改进点说明:
- 修正导入语句为
import matplotlib.pyplot as plt,这是Matplotlib绘图的标准导入方式。 - 明确指定X轴为Date列(无论是设为索引还是直接传入
x参数),确保时间序列的X轴是你需要的日期。 - 添加
label参数并调用plt.legend(),让两条线有明确的标识。 - 用
autofmt_xdate()和DateFormatter处理日期刻度,解决重叠问题,让日期显示更清晰。 - 补充标题、坐标轴标签,让图表信息更完整。
内容的提问来源于stack exchange,提问作者chetan buye
相关产品推荐
相关产品推荐

