如何在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点的垂直位置完全重合。具体修改如下:
- 在
mpf.plot()调用中添加returnfig=True参数,获取图表的figure和axes对象。 - 定位到MACD所在的panel(第三个panel,索引为2:panel0为主K线图、panel1为成交量、panel2为MACD)。
- 获取左右两侧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
相关产品推荐
相关产品推荐

