将datetime64[ns]类型的Open time设为DataFrame索引后,Matplotlib绘图中买卖信号箭头消失的解决方法
解决设置Datetime索引后买卖信号箭头消失的问题
我明白你遇到的困扰了——把Open time设为DataFrame的索引后,买卖信号的箭头就消失了,但你又需要x轴显示清晰的时间刻度。其实问题出在索引类型变化后,绘图时的坐标匹配逻辑上,咱们调整一下代码就能完美解决:
修改后的完整代码
import pandas as pd import matplotlib.pyplot as plt df4 = pd.read_csv('data/df_4h.csv', parse_dates=['Open time']) df4.set_index('Open time', inplace=True) # 现在可以正常启用这行代码了 fig, ax2 = plt.subplots(figsize=(15, 10)) df4['Close'].plot(ax=ax2, color='k', lw=1, label='Close Price') df4['4_EMA'].plot(ax=ax2, color='b', lw=1, label='4_EMA') df4['20_EMA'].plot(ax=ax2, color='g', lw=1, label='20_EMA') # 绘制买入信号:使用datetime索引作为x坐标 buy_signals = df4[df4['Position'] == 1] ax2.plot(buy_signals.index, buy_signals['4_EMA'], '^', markersize=15, color='g', alpha=0.7, label='buy') # 绘制卖出信号:同样使用datetime索引 sell_signals = df4[df4['Position'] == -1] ax2.plot(sell_signals.index, sell_signals['4_EMA'], 'v', markersize=15, color='r', alpha=0.7, label='sell') # 让时间刻度旋转45度,避免重叠,提升可读性 plt.xticks(rotation=45) plt.legend() plt.show()
为什么这样修改有效?
- 当你把
Open time设为索引后,DataFrame的索引变成了datetime64类型,主图的x轴也随之切换为时间戳,不再是默认的整数位置。 - 原来的代码在未设置索引时,依赖默认整数索引定位箭头位置,切换为datetime索引后这个逻辑就失效了,导致箭头消失。现在我们直接用筛选后行的datetime索引作为x坐标,和主图的x轴类型完全匹配,箭头就能精准显示在对应的时间点上。
- 新增的
plt.xticks(rotation=45)可以让时间刻度旋转,避免因文本过长导致的重叠问题,让x轴刻度更易读。
内容的提问来源于stack exchange,提问作者Manuel Simões
相关产品推荐
相关产品推荐

