我正在尝试在地块上添加水印图像,例如在this答案中做了类似的操作,但也在水印图像的底部添加了一些文本。
我不能只是将文本作为图像的一部分,因为文本会不时变化。
img = mpimg.imread('/path/to/image.png')
imagebox = OffsetImage(img, alpha=0.5)
ao = AnchoredOffsetbox('lower left', pad=0, borderpad=1, child=imagebox)
ax.add_artist(ao)
无法将另一个Artist添加到AnchoredOffsetbox,因为其中只能有一个single child。
有什么方法可以向该图像添加文本,还是可以使用另一个容器?</ p>
谢谢!
答案 0 :(得分:1)
如in the documentation所述,如果您希望AnchoredOffsetbox
中有多个孩子,则可以选择使用容器盒(VPacker
,HPacker
):
当需要多个子代时,请使用其他OffsetBox类将它们括起来。
import matplotlib.pyplot as plt
from matplotlib.offsetbox import (OffsetImage, TextArea, AnchoredOffsetbox, VPacker)
def create_watermark(imagePath, label, ax=None, alpha=0.5):
if ax is None:
ax = plt.gca()
img = plt.imread(imagePath)
imagebox = OffsetImage(img, alpha=alpha, zoom=0.2)
textbox = TextArea(label, textprops=dict(alpha=alpha))
packer = VPacker(children=[imagebox, textbox], mode='fixed', pad=0, sep=0, align='center')
ao = AnchoredOffsetbox('lower left', pad=0, borderpad=1, child=packer)
ax.add_artist(ao)
if __name__ == '__main__':
fig, ax0 = plt.subplots()
create_watermark('../lena.png', 'WATERMARK', ax=ax0)
plt.show()
答案 1 :(得分:0)
仅使用plt.text(x, y, s)
就足够了。 x
是x轴的坐标,而y
是y轴的坐标。 s
是您要写入情节的字符串。
from PIL import Image
import matplotlib.pyplot as plt
from matplotlib.offsetbox import ( OffsetImage,AnchoredOffsetbox)
def watermark2(ax):
img = Image.open('stinkbug.png')
width, height = ax.figure.get_size_inches()*fig.dpi
wm_width = int(width/4) # make the watermark 1/4 of the figure size
scaling = (wm_width / float(img.size[0]))
wm_height = int(float(img.size[1])*float(scaling))
img = img.resize((wm_width, wm_height), Image.ANTIALIAS)
imagebox = OffsetImage(img, zoom=1, alpha=0.2)
imagebox.image.axes = ax
ao = AnchoredOffsetbox(4, pad=0.01, borderpad=0, child=imagebox)
ao.patch.set_alpha(0)
ax.add_artist(ao)
fig, ax = plt.subplots()
ax.plot([1,2,3,4], [1,3,4.5,5])
watermark2(ax)
plt.text(3.7, 1.0, "text example")
ax.set_xlabel("some xlabel")
plt.show()