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

Python mplfinance自定义绘图:修改填充色、添加logo价格避免重叠咨询

mplfinance需求实现方案

1. 修改填充图形颜色

fill_between参数支持传入字典自定义填充样式,将原有fill_between=df['Close'].values替换为如下配置即可:

fill_between={
    'y1': df['Close'].values,
    'color': '#你想要的色值', # 例如半透绿可以填'#00ff00'
    'alpha': 0.3, # 填充透明度,0-1之间,数值越低越透明
    'edgecolor': 'none' # 可选,填充区域边缘线颜色
}

2. 添加logo、价格信息并避免重叠

核心思路是先获取mplfinance绘图返回的画布和轴对象,再用matplotlib原生方法添加自定义元素,操作步骤如下:

  1. 调整绘图配置预留顶部空白:
    • 注释掉tight_layout=True参数,避免自动布局压缩顶部空间
    • 适当调大scale_padding中top的数值,比如从5改成7,预留出放logo和价格信息的空白区域
    • 在mpf.plot()参数中新增returnfig=True,获取绘图的画布对象fig和轴对象列表axs
  2. 调用matplotlib方法添加元素:
    • 左上角logo用fig.figimage()添加,调整yo参数控制上下位置,数值越大越靠上
    • 右上角价格信息用主图轴axs[0].text()添加,调整y参数控制上下位置,数值越大越靠上

修改后完整代码示例

import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
from PIL import Image

def chartBuilber(self):
    df: pd.DataFrame = pd.DataFrame.from_dict(self.priceHistory()).fillna(method="backfill")
    df.set_index('Date', inplace=True)
    df = df.astype(float)

    market_colors = mpf.make_marketcolors(
        base_mpf_style="yahoo"
    )
    rc = {
        "axes.labelcolor": "none",
        "axes.spines.bottom": True,
        "axes.spines.left": False,
        "axes.spines.right": False,
        "axes.spines.top": False,
        "font.size": 12,
    }

    styles = mpf.make_mpf_style(
        base_mpf_style="nightclouds",
        marketcolors=market_colors,
        gridstyle="",
        rc=rc
    )

    # 核心修改:返回画布轴对象、调整填充配置、预留顶部空间
    fig, axs = mpf.plot(df, type='line',
             title='Test',
             linecolor='#00ff00',
             style=styles,
             volume=True,
             figsize=(18, 12),
             figscale=0.5,
             fill_between={'y1': df['Close'].values, 'color': '#00ff00', 'alpha': 0.3},
             # tight_layout=True, 注释自动布局避免压缩顶部
             scale_padding={'left': 0.5, 'top': 7, 'right': 0.7, 'bottom': 1},
             returnfig=True)
    
    # 添加左上角logo,替换为你的本地logo路径
    logo = Image.open("logo_path.png")
    logo = logo.resize((120, 60)) # 按需调整logo尺寸
    fig.figimage(logo, xo=30, yo=fig.bbox.ymax - 80, zorder=10) # yo控制上下位置,自行调整数值

    # 添加右上角价格信息
    latest_close = df['Close'].iloc[-1]
    price_content = f"收盘价: {latest_close:.2f}"
    # y参数控制上下位置,transform用轴相对坐标适配不同画布尺寸
    axs[0].text(x=0.98, y=1.15, s=price_content,
                transform=axs[0].transAxes,
                ha='right', fontsize=14, color='white',
                bbox=dict(facecolor='#1a1a1a', alpha=0.8, pad=6))

    plt.show()

位置调整说明

如果出现元素重叠,按如下规则调整即可:

  • 顶部空白不足:继续调大scale_padding['top']的数值
  • logo位置不对:调整xo(左右,越大越靠右)、yo(上下,越大越靠上)参数
  • 价格文本位置不对:调整x(左右,越大越靠右)、y(上下,越大越靠上)参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:54:01