mplfinance绘图正常但X轴日期格式异常,求解决方案
解决mplfinance绘图右键点击日期错误问题
问题核心:mplfinance绘图时,X轴实际使用的是数据的整数索引位置,而非matplotlib标准的日期数值(从1970年开始的天数),所以直接用mdates.num2date(x)会把索引值当成日期天数计算,得到1970年左右的错误日期。
解决步骤:
- 在画布类中保存绘图用的原始股票数据(需是带DatetimeIndex的DataFrame)
- 右键点击时,将
event.xdata转换为整数索引,再从原始数据中取出对应日期 - 如果使用了
set_xlim做视图缩放,需要计算可见区域的索引偏移
修改后的代码示例:
class MyMplCanvas(FigureCanvas): def __init__(self, parent=None, width=5, height=4, dpi=300): self.fig, ax = plt.subplots(2, 1, sharex=True, gridspec_kw={'height_ratios': [4, 1]}) plt.subplots_adjust(hspace = 0) plt.rcParams['axes.grid'] = True self.ax = ax[0] self.volax = ax[1] # 新增:用于保存绘图的原始股票数据(需传入带DatetimeIndex的DataFrame) self.stock_data = None super().__init__(self.fig) self.setParent(parent) self.mpl_connect('button_press_event', self.on_mouse_click) def set_stock_data(self, data): # 外部调用此方法传入绘图用的股票数据 self.stock_data = data def on_mouse_click(self, event): if event.button == 3 and self.stock_data is not None: # 右键+数据已初始化 x, y = event.xdata, event.ydata if x is None: return # 点击在图表区域外,直接返回 # 将x坐标转换为数据的整数索引 idx = int(round(x)) # 确保索引在数据范围内 if 0 <= idx < len(self.stock_data): date = self.stock_data.index[idx] date_str = date.strftime('%Y-%m-%d') msg = f'Datum: {date_str}\nPrice: {y:.2f}' QMessageBox.information(self, 'Mouse Position', msg)
缩放场景适配:
如果使用了set_xlim进行视图缩放,比如设置了self.ax.set_xlim(left, right),需要调整索引计算逻辑,用可见区域的起始索引加上点击的相对位置:
# 在on_mouse_click中替换索引计算部分 left, right = self.ax.get_xlim() actual_idx = int(round(left + x))
内容的提问来源于stack exchange,提问作者finny
相关产品推荐
相关产品推荐

