如何为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
相关产品推荐
相关产品推荐

