我正在寻找一种将图像的角边缘与文本框边缘(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)
感谢 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))。
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |