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

mplfinance多图绘制异常:secondary_y失效及零值数组报错

在mplfinance单个面板对比多资产走势的问题解决

先处理「ValueError: zero-size array...」错误

这个错误基本是多组数据时间索引不匹配或某组数据为空导致的,解决步骤:

  • 确保指数、两只脚本的数据集都带有统一格式的DatetimeIndex(比如YYYY-MM-DD),且无空值
  • 用pd.merge按索引合并三个数据集,填充缺失值并删除完全空的行,保证所有数据时间对齐:
# 假设df_index是指数数据,df_scrip1、df_scrip2是两只脚本数据
merged_df = pd.merge(df_index, df_scrip1[['Close']], left_index=True, right_index=True, suffixes=('_index', '_scrip1'))
merged_df = pd.merge(merged_df, df_scrip2[['Close']], left_index=True, right_index=True, suffixes=('', '_scrip2'))
merged_df = merged_df.ffill().dropna()  # 填充缺失值并清理无效行
  • 主图与addplot用的数据集必须索引完全一致,mplfinance不接受索引错位的数据。

修复secondary_y=True失效问题

mplfinance的secondary_y=True需要在make_addplot和mpf.plot中同时明确配置,还要指定对应列:

import mplfinance as mpf

# 定义要添加的副轴曲线
ap = [
    mpf.make_addplot(merged_df['Close_scrip1'], secondary_y=True, color='blue', label='Scrip1'),
    mpf.make_addplot(merged_df['Close_scrip2'], secondary_y=True, color='red', label='Scrip2')
]

# 绘图时开启副轴并设置标签
mpf.plot(merged_df, type='candle', addplot=ap, figratio=(16,9), 
         secondary_y=True, ylabel='Index Price', ylabel_lower='Scrip Prices',
         title='Index vs Two Scrips')

如果副轴仍不显示,检查是否开启了show_nontrading=True引入空数据干扰,或者去掉该参数重试。

解决Y轴范围过宽导致的绘图压缩问题

指数与脚本价格量级差异大时,直接绘图会导致某方走势被压缩,两种解决方式:

  1. 归一化处理:将所有资产价格转换为相对于起始日的百分比涨幅,统一量级:
# 计算归一化价格(基准为首日价格)
merged_df['Index_norm'] = (merged_df['Close_index'] / merged_df['Close_index'].iloc[0]) * 100
merged_df['Scrip1_norm'] = (merged_df['Close_scrip1'] / merged_df['Close_scrip1'].iloc[0]) * 100
merged_df['Scrip2_norm'] = (merged_df['Close_scrip2'] / merged_df['Close_scrip2'].iloc[0]) * 100

# 用归一化数据绘图
ap_norm = [
    mpf.make_addplot(merged_df['Scrip1_norm'], color='blue', label='Scrip1'),
    mpf.make_addplot(merged_df['Scrip2_norm'], color='red', label='Scrip2')
]

mpf.plot(merged_df, type='candle', y='Index_norm', addplot=ap_norm, figratio=(16,9),
         title='Index vs Two Scrips (Normalized to Start Price)',
         ylabel='Normalized Price (Base=100)')
  1. 手动设置Y轴范围:给主、副轴分别限定范围:
mpf.plot(merged_df, type='candle', addplot=ap, figratio=(16,9),
         ylim=(merged_df['Close_index'].min()*0.95, merged_df['Close_index'].max()*1.05),
         secondary_y=True, secondary_y_lim=(merged_df[['Close_scrip1','Close_scrip2']].min().min()*0.95, merged_df[['Close_scrip1','Close_scrip2']].max().max()*1.05))

避免控制台退出问题

之前用Stack Overflow的多图共享X轴方案崩溃,是因为mplfinance是matplotlib的高层封装,手动操作底层轴容易引发冲突。直接用mplfinance自带的addplot在单个面板绘图是最稳定的,不要混用原生matplotlib的子图创建方法。

内容的提问来源于stack exchange,提问作者DrSaaie K B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:03:23