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

mplfinance绘图面板重叠且panel_ratio设置无效问题求助

问题原因与解决方案

核心问题

你手动创建Matplotlib的Figure和Axes对象的方式,与mplfinance的内置面板管理机制冲突,导致panel_ratios失效、布局重叠。mplfinance有自己的面板布局系统,无需手动添加子图,强行手动创建会干扰其自动布局逻辑。

具体问题解析

  1. panel_ratios=(6,1)未生效:该参数仅在mplfinance自动生成面板时起作用。你手动创建了ax1和ax2,mplfinance会直接在这些已有Axes上绘图,忽略面板比例配置。
  2. Y轴重叠、K线截断:手动创建的子图布局未预留足够间距,且mplfinance不会自动调整手动创建的Axes位置,导致顶部面板Y轴向下延伸与底部面板重叠,截断K线。

修正后的代码

import pandas as pd
import numpy as np
import mplfinance as mpf

times = pd.date_range(start='2022-01-01', periods=50, freq='ms')

def get_rsi(df, rsi_period):
    chg = df['close'].diff(1)
    gain = chg.mask(chg<0,0)
    loss = chg.mask(chg>0,0)
    avg_gain = gain.ewm(com=rsi_period-1, min_periods=rsi_period).mean()
    avg_loss = loss.ewm(com=rsi_period-1, min_periods=rsi_period).mean()
    rs = abs(avg_gain/avg_loss)
    rsi = 100 - (100/(1+rs))
    return rsi

df = pd.DataFrame(np.random.randint(3000, 3100, (50, 1)), columns=['open'])
df['high'] = df.open+5
df['low'] = df.open-2
df['close'] = df.open
df['rsi14'] = get_rsi(df, 14)
df.set_index(times, inplace=True)

# 直接使用mplfinance的原生方式配置面板
ap0 = [mpf.make_addplot(df['rsi14'], color='g', ylim=(10,90), panel=1)]
mpf.plot(df, 
         style="charles", 
         figsize=(7,8), 
         ylim=(2999,3104), 
         addplot=ap0, 
         panel_ratios=(6,1))

mpf.show()

关键改动说明

  • 移除手动创建fig、ax1、ax2的代码,让mplfinance自动管理面板和布局。
  • mpf.make_addplot中无需指定ax参数,仅通过panel=1指定将RSI绘制在第2个面板(从0开始计数)。
  • panel_ratios=(6,1)现在会生效,顶部面板高度是底部的6倍。
  • mplfinance会自动调整面板间距,避免Y轴重叠,K线不会被截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:25:26