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原生方法添加自定义元素,操作步骤如下:
- 调整绘图配置预留顶部空白:
- 注释掉
tight_layout=True参数,避免自动布局压缩顶部空间 - 适当调大
scale_padding中top的数值,比如从5改成7,预留出放logo和价格信息的空白区域 - 在
mpf.plot()参数中新增returnfig=True,获取绘图的画布对象fig和轴对象列表axs
- 注释掉
- 调用matplotlib方法添加元素:
- 左上角logo用
fig.figimage()添加,调整yo参数控制上下位置,数值越大越靠上 - 右上角价格信息用主图轴
axs[0].text()添加,调整y参数控制上下位置,数值越大越靠上
- 左上角logo用
修改后完整代码示例
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
相关产品推荐
相关产品推荐

