如何在Python的mplfinance绘图中添加图片、价格标签并调整时间轴空白
mplfinance设置ylim图表消失及相关需求解决方案
问题原因
设置ylim后图表消失主要有两个常见原因:
- 传入的ylim数值范围未覆盖收盘价的实际波动区间,所有数据被挤出显示范围
- 开启
volume=True后未单独设置成交量副图的显示范围,或参数传递格式错误
具体解决方法
1. 正确设置ylim实现y轴留白
先基于收盘价数据计算合理的上下限,再分别传入主图ylim和成交量副图volume_ylim参数,同时关闭tight_layout避免和自定义留白参数冲突:
# 计算收盘价上下10%的范围作为主图ylim,确保数据在显示区间内 close_min = df['Close'].min() close_max = df['Close'].max() ylim_padding = (close_max - close_min) * 0.1 main_ylim = (close_min - ylim_padding, close_max + ylim_padding) # 计算成交量的范围,同样留10%留白 vol_min = df['Volume'].min() vol_max = df['Volume'].max() vol_padding = (vol_max - vol_min) * 0.1 vol_ylim = (vol_min - vol_padding, vol_max + vol_padding) # 调整后的plot调用 mpf.plot(df, type='line', title='Test', linecolor='white', style=styles, volume=True, figsize=(8, 6), figscale=0.5, fill_between=filledShape, tight_layout=False, # 关闭自动布局避免覆盖自定义留白 scale_padding={'left': 1, 'top': 5, 'right': 1, 'bottom': 2}, ylim=main_ylim, # 主图y轴范围 volume_ylim=vol_ylim # 成交量副图y轴范围 )
2. 时间轴(x轴)增加留白
- 如果是要时间范围前后留空白:可以在df首尾新增几行对应时间的空数据(数值列设为NaN),或者传入
xlim参数扩展x轴的时间范围 - 如果是要时间轴下方的边距留白:直接调大
scale_padding里的bottom参数数值即可,数值越大留白越多
3. 添加价格标签
通过mpf.make_addplot()构造标记图层,再传入plot方法的addplot参数:
# 示例:标记所有收盘价高于90分位的点 label_points = df['Close'].where(df['Close'] > df['Close'].quantile(0.9)) # 创建标记图层,设置标记样式和标注文本 tag_plot = mpf.make_addplot(label_points, type='scatter', marker='^', markersize=100, color='red', secondary_y=False, annotations=[(idx, val, f'{val:.2f}') for idx, val in label_points.dropna().items()]) # 在mpf.plot调用中新增参数 addplot=[tag_plot] 即可
4. 添加自定义图片
在调用mpf.plot时设置returnfig=True拿到matplotlib的画布和轴对象,再用matplotlib原生方法添加图片:
from PIL import Image import numpy as np # 读取要添加的图片 custom_img = np.array(Image.open('你的本地图片路径.png')) # 绘图时获取画布对象 fig, axlist = mpf.plot(df, ... , returnfig=True) # 在画布指定位置添加图片,后两个参数对应左上角的像素坐标,可按需调整 fig.figimage(custom_img, 10, fig.bbox.ymax - 100, zorder=100)
内容的提问来源于stack exchange,提问作者NoNam4
相关产品推荐
相关产品推荐

