You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:56:06