图表无法显示正确日期求助:多只股票开盘价绘图异常
解决股票开盘价图表日期格式异常的问题
嘿,我看到你在绘制DMART、SRTRANSFIN、INFY三只股票开盘价时,遇到了日期显示混乱的问题,这确实是matplotlib处理短时间序列时常见的小坑,咱们一步步来搞定它:
问题根源
从你提供的图表来看,日期轴显示得乱糟糟的,主要原因有两个:
- matplotlib默认的日期刻度逻辑对仅4个交易日的短时间范围适配不好,会自动生成多余刻度或者格式混乱的标签
- 虽然
nsepy返回的DataFrame索引是datetime类型,但直接调用plot()方法时,matplotlib没有针对性地处理日期显示规则
修正后的代码
我给你调整了代码,手动控制日期的显示格式和刻度,确保每个交易日都清晰展示:
import matplotlib.pyplot as plt from datetime import date from nsepy import get_history import matplotlib.dates as mdates # 获取三只股票的历史数据 avenue_df = get_history(symbol='DMART', start=date(2018,5,6), end=date(2018,5,10)) shriram_df = get_history(symbol='SRTRANSFIN', start=date(2018,5,6), end=date(2018,5,10)) infy_df = get_history(symbol='INFY', start=date(2018,5,6), end=date(2018,5,10)) # 创建绘图对象,方便自定义坐标轴设置 fig, ax = plt.subplots() # 把三条线都画到同一个坐标轴上 avenue_df.Open.plot(ax=ax, color='green', label='DMART') shriram_df.Open.plot(ax=ax, color='red', label='SHRI') infy_df.Open.plot(ax=ax, color='blue', label='INFY') # 设置日期显示格式,这里用月-日的形式,你也可以改成%Y-%m-%d显示完整年份 date_formatter = mdates.DateFormatter('%m-%d') ax.xaxis.set_major_formatter(date_formatter) # 让每个交易日都显示一个刻度,避免出现空的非交易日刻度 ax.xaxis.set_major_locator(mdates.DayLocator(interval=1)) # 旋转日期标签45度,防止它们挤在一起 plt.xticks(rotation=45) # 添加图例,位置保持你原来的左上角 plt.legend(loc='upper left') # 自动调整布局,防止日期标签被图表边缘截断 plt.tight_layout() # 显示图表 plt.show()
关键调整说明
- 引入
matplotlib.dates模块:这个模块专门用来处理matplotlib里的日期格式化和刻度控制,是解决这类问题的核心 - 用
subplots()创建绘图对象:这样能直接操作坐标轴ax,比默认的plot方法更灵活 - 自定义日期格式和刻度:通过
DateFormatter指定显示样式,DayLocator确保每个交易日都有刻度,不会出现多余的非交易日标记 - 旋转标签+调整布局:这两步是为了让日期标签显示得更美观,不会重叠或者被截断
这样修改后,你的图表日期轴就会清晰显示每个交易日的日期,格式完全符合预期啦!
内容的提问来源于stack exchange,提问作者Vedant Joshi




