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
相关产品推荐
相关产品推荐

