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

mplfinance调用add_artist报AttributeError:dict对象无axes属性

使用mplfinance绘制OHLC图表时的自定义类元素添加问题

问题场景

我用mplfinance绘制股票OHLC(开盘-最高-最低-收盘)图表,希望封装成自定义类以添加额外元素,初始类代码如下:

class CandlestickChart:
    def __init__(self, data):
        self.data = data
        self.fig, self.ax = mpf.plot(
            self.data,
            type="ohlc",
            volume=False,
            returnfig=True,
        )

编写add_swap_zone方法,通过mpf.make_addplot生成绘图对象后,尝试添加到self.ax[0]:

def add_swap_zone(self, swap_zone):
        zone_data = self.data.copy()
        zone_data["in_swap_zone"] = (zone_data.index >= swap_zone.x_left) & (
            zone_data.index <= swap_zone.x_right
        )
        zone_data["swap_zone_val"] = np.nan
        zone_data.loc[zone_data["in_swap_zone"], "swap_zone_val"] = swap_zone.y_down
        zone_data["swap_zone_val"].fillna(swap_zone.y_up, inplace=True)

        ap_swap_zone = mpf.make_addplot(
            zone_data["swap_zone_val"],
            type="bar",
            width=0.5,
            color=swap_zone.style.FILL_COLOUR,
            alpha=swap_zone.style.FILL_ALPHA,
            panel=0,
            secondary_y=False,
        )

        self.ax[0].add_artist(ap_swap_zone)

触发的错误

执行时抛出如下异常:

Traceback (most recent call last):
  File "/Users/user/projects/charter/src/draw/demo/demo_plot.py", line 42, in <module>
    main()
  File "/Users/user/projects/charter/src/draw/demo/demo_plot.py", line 35, in main
    cs_chart.add_swap_zone(
  File "/Users/user/projects/charter/src/draw/plot.py", line 39, in add_swap_zone
    self.ax[0].add_artist(ap_swap_zone)
  File "/Users/user/projects/charter/venv/lib/python3.11/site-packages/matplotlib/axes/_base.py", line 2219, in add_artist
    a.axes = self
    ^^^^^^
AttributeError: 'dict' object has no attribute 'axes'

尝试过的无效方案

  • self.ax[list(self.ax.keys())[0]].add_artist(ap_swap_zone)
  • self.ax["0"].add_artist(ap_swap_zone)

修正后的代码

调整实现思路,先收集所有额外绘图配置,再在绘制主图表时统一传入:

class CandlestickChart:
    def __init__(self, data):
        self.data = data
        self.addplot_specs = []

    def add_swap_zone(self, swap_zone):
        zone_data = self.data.copy()
        zone_data["in_swap_zone"] = (zone_data.index >= swap_zone.x_left) & (
            zone_data.index <= swap_zone.x_right
        )
        zone_data["swap_zone_val"] = np.nan
        zone_data.loc[zone_data["in_swap_zone"], "swap_zone_val"] = swap_zone.y_down
        zone_data["swap_zone_val"].fillna(swap_zone.y_up, inplace=True)

        ap_swap_zone = mpf.make_addplot(
            zone_data["swap_zone_val"],
            type="bar",
            width=0.5,
            color=swap_zone.style.FILL_COLOUR,
            alpha=swap_zone.style.FILL_ALPHA,
            panel=0,
            secondary_y=False,
        )

        self.addplot_specs.append(ap_swap_zone)

    def plot(self):
        self.fig, self.ax = mpf.plot(
            self.data,
            type="ohlc",
            volume=False,
            returnfig=True,
            addplot=self.addplot_specs,
        )
        mpf.show()

修正说明

  • 构造函数中初始化空列表self.addplot_specs,用于存储所有额外绘图的配置对象
  • 在add_swap_zone方法中,将生成的mpf.make_addplot对象添加到该列表
  • 新增plot方法,调用mpf.plot时通过addplot参数传入所有收集到的绘图配置,最后显示图表

内容的提问来源于stack exchange,提问作者neo-technoker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:19:54