plt.plot绘图异常:买卖信号标记未对应正确X轴日期
问题解决方案
核心原因
买卖信号堆在X轴左侧,本质是DataFrame的索引未被识别为日期时间类型。如果索引是普通字符串格式,matplotlib会把所有日期当作同一类别的离散值,全部挤在X轴起始位置,导致信号无法对应到正确日期。
修复步骤
1. 把索引转换成datetime类型
先确认你的日期列(比如列名为date),将其转为datetime并设为索引:
import pandas as pd # 转换日期列为datetime格式 df['date'] = pd.to_datetime(df['date']) # 设置为索引并排序 df.set_index('date', inplace=True) df.sort_index(inplace=True)
2. 修正代码里的小错误
你代码里有两处笔误,顺便修正避免其他问题:
plt.figure(figsize=(20,10)) # 修正figsdize拼写错误 # 绘制收盘价、均线 df['close'].plot(color='k', label='Close Price') df['sma_20'].plot(color='b', label='20-day SMA') df['ema_10'].plot(color='g', label='10-day EMA') # 修正label错误(原写的50-day SMA) # 绘制买入信号 plt.plot(df[df['positions'] == 1].index, df['sma_20'][df['positions'] == 1], '^', markersize=15, color='g', label='buy') # 绘制卖出信号 plt.plot(df[df['positions'] == -1].index, df['sma_20'][df['positions'] == -1], 'v', markersize=15, color='r', label='sell') plt.ylabel('Price in Rupees', fontsize=15 ) plt.xlabel('Date', fontsize=15 ) plt.title('ULTRACEMCO', fontsize=20) plt.legend() plt.grid() plt.show()
3. 验证索引类型
运行下面代码确认索引是否正确转为datetime:
print(df.index.dtype) # 正常输出应为 datetime64[ns]
额外排查建议
- 若从CSV读取数据,直接在读取时解析日期:
df = pd.read_csv('your_data.csv', parse_dates=['date'], index_col='date') - 检查
positions列中值为1/-1的行,确认对应的索引日期无空值或异常格式。
内容的提问来源于stack exchange,提问作者indianapolis.jones
相关产品推荐
相关产品推荐

