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

如何在Matplotlib/mplfinance面板中为指定索引的随机指标绘制圈选

解决mplfinance中Stochastic子图添加标记点不显示的问题

核心原因

mplfinance的子图(如Stochastic指标图)有独立的绘图上下文,直接使用matplotlib原生绘图函数(如plt.scatter)若未关联到正确的子图,会导致标记点无法显示。以下是两种可行的解决方案:


方案一:利用make_addplot构造标记层

这种方式更贴合mplfinance的绘图逻辑,无需手动操作axes对象:

  1. 提取目标区间的%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
    
  2. 将标记层与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直接绘制

适合需要更灵活绘图逻辑的场景:

  1. 先绘制基础图表,返回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)
    
  2. 获取Stochastic所在的子图(默认panel=1对应axes[1],panel0为K线图)
    stochastic_ax = axes[1]
    
  3. 用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)
    
  4. 刷新并显示图表
    fig.canvas.draw()
    mpf.show()
    

关键注意事项

  • 若使用datetime索引,需确保目标索引是数据的位置索引(可通过df.index.get_loc()转换)
  • 使用make_addplot时必须指定panel参数,确保标记画在Stochastic子图上
  • 直接操作axes时,x轴坐标需用数值位置(np.arange(len(df))),而非datetime字符串

内容的提问来源于stack exchange,提问作者NoahVerner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:05:18