如何在Matplotlib/mplfinance面板中为指定索引的随机指标绘制圈选
解决mplfinance中Stochastic子图添加标记点不显示的问题
核心原因
mplfinance的子图(如Stochastic指标图)有独立的绘图上下文,直接使用matplotlib原生绘图函数(如plt.scatter)若未关联到正确的子图,会导致标记点无法显示。以下是两种可行的解决方案:
方案一:利用make_addplot构造标记层
这种方式更贴合mplfinance的绘图逻辑,无需手动操作axes对象:
- 提取目标区间的%K、%D数据,其余位置设为
NaN(仅显示目标点)import numpy as np import mplfinance as mpf # 假设df为包含'%K'、'%D'列的K线数据DataFrame # 构造紫色标记用的%K/%D数组(仅保留索引15-19) purple_k = df['%K'].copy() purple_k[:15] = np.nan purple_k[20:] = np.nan purple_d = df['%D'].copy() purple_d[:15] = np.nan purple_d[20:] = np.nan # 构造红色标记用的%K/%D数组(仅保留索引23-27) red_k = df['%K'].copy() red_k[:23] = np.nan red_k[28:] = np.nan red_d = df['%D'].copy() red_d[:23] = np.nan red_d[28:] = np.nan - 将标记层与Stochastic指标一起传入
addplot参数apds = [ # 绘制Stochastic基础指标线 mpf.make_addplot(df['%K'], color='blue', panel=1), mpf.make_addplot(df['%D'], color='orange', panel=1), # 紫色标记点 mpf.make_addplot(purple_k, type='scatter', marker='o', color='purple', markersize=8, panel=1), mpf.make_addplot(purple_d, type='scatter', marker='o', color='purple', markersize=8, panel=1), # 红色标记点 mpf.make_addplot(red_k, type='scatter', marker='o', color='red', markersize=8, panel=1), mpf.make_addplot(red_d, type='scatter', marker='o', color='red', markersize=8, panel=1) ] # 绘制K线与指标 mpf.plot(df, type='candle', addplot=apds, panel_ratios=(3,1), figratio=(16,9))
方案二:手动获取子图Axes直接绘制
适合需要更灵活绘图逻辑的场景:
- 先绘制基础图表,返回fig和axes对象
fig, axes = mpf.plot(df, type='candle', addplot=[ mpf.make_addplot(df['%K'], color='blue', panel=1), mpf.make_addplot(df['%D'], color='orange', panel=1) ], panel_ratios=(3,1), figratio=(16,9), returnfig=True) - 获取Stochastic所在的子图(默认panel=1对应
axes[1],panel0为K线图)stochastic_ax = axes[1] - 用matplotlib原生函数绘制标记点(注意x轴用数值索引对应数据位置)
x_vals = np.arange(len(df)) # 绘制紫色标记(索引15-19) purple_indices = range(15,20) stochastic_ax.scatter(x_vals[purple_indices], df['%K'].iloc[purple_indices], color='purple', marker='o', s=64) stochastic_ax.scatter(x_vals[purple_indices], df['%D'].iloc[purple_indices], color='purple', marker='o', s=64) # 绘制红色标记(索引23-27) red_indices = range(23,28) stochastic_ax.scatter(x_vals[red_indices], df['%K'].iloc[red_indices], color='red', marker='o', s=64) stochastic_ax.scatter(x_vals[red_indices], df['%D'].iloc[red_indices], color='red', marker='o', s=64) - 刷新并显示图表
fig.canvas.draw() mpf.show()
关键注意事项
- 若使用datetime索引,需确保目标索引是数据的位置索引(可通过
df.index.get_loc()转换) - 使用
make_addplot时必须指定panel参数,确保标记画在Stochastic子图上 - 直接操作axes时,x轴坐标需用数值位置(
np.arange(len(df))),而非datetime字符串
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

