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

如何在mplfinance中使MACD双Y轴的y=0点重合?

解决mplfinance中MACD双Y轴0点未对齐的问题

问题原因

你当前代码将diff、dea曲线放在secondary_y=True(右侧Y轴),MACD柱状图放在secondary_y=False(左侧Y轴)。mplfinance会分别根据两组数据的数值范围自动计算两个Y轴的刻度,导致两个轴的0点不在同一水平线上。

解决步骤

通过获取绘图后的坐标轴对象,手动调整两个Y轴的刻度范围,让0点的垂直位置完全重合。具体修改如下:

  1. 在mpf.plot()调用中添加returnfig=True参数,获取图表的figure和axes对象。
  2. 定位到MACD所在的panel(第三个panel,索引为2:panel0为主K线图、panel1为成交量、panel2为MACD)。
  3. 获取左右两侧Y轴对象,计算0点在两个轴上的相对位置,调整右侧Y轴的刻度范围使0点对齐。

修改后的完整代码

exp12 = data['Close'].ewm(span=12, adjust=False).mean()
exp26 = data['Close'].ewm(span=26, adjust=False).mean()

diff = exp12 - exp26
dea  = diff.ewm(span=9, adjust=False).mean()
macd = (diff - dea)*2

colors = ['g' if v >= 0 else 'r' for v in macd]

apds = [
        # moving average
        mpf.make_addplot(ma.tail(N2)['MA8'], color='red', width=0.7),
        mpf.make_addplot(ma.tail(N2)['MA20'], color='blue', width=0.7),
        mpf.make_addplot(ma.tail(N2)['MA60'], color='green', width=0.7),
        
        # MACD
        mpf.make_addplot(diff, panel=2,color='fuchsia',secondary_y=True,ylabel='MACD'),  
        mpf.make_addplot(dea,  panel=2,color='b',      secondary_y=True),
        mpf.make_addplot([0]*len(diff),panel=2,color='black', secondary_y=True, linestyle='dotted'),
        mpf.make_addplot(macd, panel=2,color=colors,   secondary_y=False,
                         type='bar',width=0.7,alpha=1),
        
        # KDJ
        mpf.make_addplot(kdj.tail(N2)['K'],panel=3,color='orangered',ylabel='KDJ'),
        mpf.make_addplot(kdj.tail(N2)['D'],panel=3,color='darkslateblue'),
        mpf.make_addplot(kdj.tail(N2)['J'],panel=3,color='limegreen'),
        mpf.make_addplot([70]*N2,panel=3,color='black', linestyle='dotted'),
        mpf.make_addplot([30]*N2,panel=3,color='black', linestyle='dotted'),
        mpf.make_addplot([50]*N2,panel=3,color='black', linestyle='dotted')
       ] 

# 绘制图表并返回fig和axes对象
fig, axes = mpf.plot(data_plot,
         type='candle',
         addplot=apds,
         figscale=1.1,
         figratio=(8,5),
         title='SA Price',
         style = 'yahoo',
         volume=True,
         volume_panel=1,
         panel_ratios=(6,2,3,3),
         returnfig=True  # 添加此参数获取绘图对象
         )

# 定位MACD所在的panel(索引为2)
macd_primary_ax = axes[2]
macd_secondary_ax = macd_primary_ax.right_ax

# 获取两个Y轴当前的刻度范围
pri_min, pri_max = macd_primary_ax.get_ylim()
sec_min, sec_max = macd_secondary_ax.get_ylim()

# 计算0点在左侧Y轴的相对位置(占总高度的比例)
if pri_max != pri_min:
    zero_ratio = (0 - pri_min) / (pri_max - pri_min)
else:
    zero_ratio = 0.5  # 防止除以0的情况

# 调整右侧Y轴的刻度范围,使0点与左侧Y轴的0点垂直对齐
new_sec_min = 0 - zero_ratio * (sec_max - sec_min)
new_sec_max = 0 + (1 - zero_ratio) * (sec_max - sec_min)
macd_secondary_ax.set_ylim(new_sec_min, new_sec_max)

# 重新绘制图表以应用修改
fig.canvas.draw()

补充说明

  • 若想简化操作,也可将diff、dea和MACD柱状图放在同一个Y轴,但需对diff、dea进行缩放(如除以系数)使其数值范围与柱状图匹配,不过这种方法会改变指标原始数值显示,不如双Y轴对齐的方式专业。
  • 代码中的panel索引对应你设置的panel_ratios=(6,2,3,3),需确保索引与布局匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:32:22