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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:05:19