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

如何在Matplotlib图表中添加PNG水印且不破坏原有绘图

在Matplotlib图表底层添加居中适配的PNG水印

直接上可运行的解决方案,核心是让水印尺寸精准匹配绘图区域,并且放在所有绘图元素的最底层:

完整示例代码

import matplotlib.pyplot as plt
import numpy as np

# ----------------------
# 1. 生成基础图表(替换成你的原有代码)
# ----------------------
fig, ax = plt.subplots(figsize=(8, 5))
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.randn(100)*0.2
ax.plot(x, y, color='#1f77b4', linewidth=2)  # 保留原有配色
ax.bar(x[:10], y[:10], color='#ff7f0e', alpha=0.7)  # 示例柱状图
ax.set_title('带底层水印的示例图表')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')

# ----------------------
# 2. 添加底层居中水印
# ----------------------
# 加载PNG水印图片,替换成你的水印路径
watermark_img = plt.imread('your_watermark.png')

# 获取Axes绘图区域的实际尺寸(转换为像素)
ax_extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
ax_width, ax_height = ax_extent.width, ax_extent.height

# 计算水印缩放比例,保持原图宽高比,适配Axes尺寸
img_height, img_width = watermark_img.shape[:2]
scale = min(ax_width / img_width, ax_height / img_height)

# 设置水印显示范围(完全覆盖Axes,天然居中)
extent = [
    ax.get_xlim()[0], ax.get_xlim()[1],
    ax.get_ylim()[0], ax.get_ylim()[1]
]

# 添加水印到Axes最底层(zorder=0确保在所有绘图元素下方)
ax.imshow(
    watermark_img,
    extent=extent,
    aspect='auto',  # 自动适配Axes宽高,避免变形
    zorder=0,
    alpha=0.15  # 调整透明度,不干扰数据查看
)

plt.tight_layout()
plt.show()

关键要点说明

  • 底层显示:通过zorder=0把水印放在最底层,Matplotlib默认的折线(zorder=2)、柱状图(zorder=1)都会自动覆盖在水印之上,不会被遮挡。
  • 尺寸适配:基于Axes的实际尺寸计算缩放比例,确保水印完整填充绘图区域,同时保留原图片宽高比,避免拉伸变形。
  • 居中对齐:直接用Axes的x、y轴范围作为水印的extent,天然实现居中覆盖。
  • 保留配色:把水印透明度(alpha)调至0.1-0.2区间,不会干扰原有图表的颜色显示。

常见问题解决

  • 若水印显示不完整:检查PNG水印是否有多余透明边距,或把scale计算里的min改成max(会裁剪部分水印,按需调整)。
  • 若绘图元素被遮挡:确保所有绘图元素的zorder大于0,默认的plot、bar、scatter等都满足,无需额外设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:55:16