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

如何为Matplotlib绘制的2×2网格子图逐个添加自定义水印

matplotlib 2×2子图单独添加水印实现方法

你之前使用的fig.text()是画布层级的方法,生成的水印会作用于整张图。要给单个子图单独添加水印,调用对应子图的Axes对象的text()方法即可,核心要加transform=ax.transAxes参数指定坐标参考系为当前子图的相对坐标系,避免水印位置受子图数据刻度影响。

修改后完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Create dummy DataFrame
df = pd.DataFrame(np.array([[1, 2], [3, 4], [5, 6]]),
                   columns=['a', 'b'])

fig, axes2 = plt.subplots(nrows=2, ncols=2, figsize=(9, 9))

# unpack all the axes subplots
axes = axes2.ravel()

df.iloc[:, [0, 1]].plot(ax=axes[0], marker='o')
axes[0].set_title('Subplot 1')

df.iloc[:, [0, 1]].plot(ax=axes[1], marker='o')
axes[1].set_title('Subplot 2')

df.iloc[:, [0, 1]].plot(ax=axes[2], marker='o')
axes[2].set_title('Subplot 3')

df.iloc[:, [0, 1]].plot(ax=axes[3], marker='o')
axes[3].set_title('Subplot 4')

# 给每个子图单独添加水印
for idx, ax in enumerate(axes):
    # 可自定义每个子图的水印内容,也可以统一用相同文本
    watermark = f"Test Watermark {idx+1}"
    ax.text(
        0.5, 0.5, watermark,
        fontsize=30, color='gray',
        ha='center', va='center', alpha=0.4, rotation=45,
        transform=ax.transAxes # 关键参数:使用子图相对坐标系
    )

plt.tight_layout()
plt.savefig('../test.png', dpi=300)
plt.show()

参数说明

  • transform=ax.transAxes:指定坐标参考系为子图自身相对坐标,(0,0)对应子图左下角,(1,1)对应子图右上角,水印位置不受子图内数据范围影响
  • 如需给不同子图设置不同的水印内容、样式,直接单独操作对应axes对象即可,无需走循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:24:04