将文本框边缘与图像角对齐

Tom*_*way 5 python matplotlib

我正在寻找一种将图像的角边缘与文本框边缘(bbox 或其他)的角和边缘精确对齐(覆盖)的方法

有问题的代码是:

import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1)
ax.imshow(np.random.random((256,256)), cmap=plt.get_cmap("viridis"))
ax.axis("off")

ax.annotate(
    s = 'image title', 
    xy=(0, 0), 
    xytext=(0, 0), 
    va='top',
    ha='left',
    fontsize = 15,
    bbox=dict(facecolor='white', alpha=1),
    )
plt.show()
Run Code Online (Sandbox Code Playgroud)

单张图片

如您所见,文本框的边缘在图像之外。对于我的生活,我找不到将文本框的角与图像的角对齐的一致方法。理想情况下,我希望对齐方式与字体大小和图像像素大小无关,但这可能要求过高。

最后,我想用图像网格来实现这一点,就像下面的第二个例子一样。

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8, 8))
images = 4*[np.random.random((256,256))]

gs = gridspec.GridSpec(
    nrows=2, 
    ncols=2,
    top=1., 
    bottom=0., 
    right=1., 
    left=0., 
    hspace=0.,
    wspace=0.,
)
for g, i in zip(gs, range(len(images))):
    ax = plt.subplot(g)
    im = ax.imshow(
        images[i],
        cmap=plt.get_cmap("viridis")
    )
    ax.set_xticks([])
    ax.set_yticks([])
    ax.annotate(
        s = 'image title', 
        xy=(0, 0), 
        xytext=(0, 0), 
        va='top',
        ha='left',
        fontsize = 15,
        bbox=dict(facecolor='white', alpha=1),
    )
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Tom*_*way 5

感谢 P-robot 提供的解决方案。该解决方案的关键部分是注释文本边缘从坐标x和y偏移1个像素xy。使用的任何额外填充都会增加补偿此偏移所需的量。下面给出的第二组参数ax.annotate是相关的。

fig, ax = plt.subplots(1)
ax.imshow(np.random.random((256,256)), cmap=plt.get_cmap("viridis"))
ax.axis("off")

padding = 5
ax.annotate(
    s = 'image title', 
    fontsize = 12,

    xy=(0, 0), 
    xytext=(padding-1, -(padding-1)), 
    textcoords = 'offset pixels',
    bbox=dict(facecolor='white', alpha=1, pad=padding),
    va='top',
    ha='left',
    )
plt.show()
Run Code Online (Sandbox Code Playgroud)

对齐图像

奇怪的是,对于四张图像的网格,x 方向的偏移不需要减去一个像素,即xytext变为xytext=(padding, -(padding-1))

四张图像的对齐网格