有没有办法为matplotlib's Rectangle patch指定边缘,以便边框位于指定的域之外?例如,在Photoshop中,这将被称为“笔画位置”#34;请允许我举例说明:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
# Here's my "image"
X = np.arange(16).reshape(4,4)
# Suppose I want to highlight some feature in the middle boxes.
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(X, cmap=plt.cm.gray, interpolation='nearest')
ax.add_patch( Rectangle((0.5, 0.5), 2, 2, fc='none', ec='r') )
plt.show()
这产生以下结果:
但是,如果修改如下
ax.add_patch( Rectangle((0.5, 0.5), 2, 2, fc='none', ec='r', lw=10) )
我得到了这个数字:
如您所见,边缘沿着Rectangle对象域的边界居中定位,因此渗入此域。是否可以强制边缘边界严格位于Rectangle域之外?
答案 0 :(得分:2)
您可以使用其中放置AnnotationBbox
的{{1}}。此AuxTransformBox
将包含所需大小的代理矩形。这可以是不可见的(例如AuxTransformBox
)。它唯一的功能是将fc='none', ec='none'
缩放到正确的大小。现在AuxTransformBox
可以给出一些大线宽的边框。如果它紧靠AnnotationBbox
边框,则只会在AuxTransformBox
结束时开始。为了使边框紧密贴合,可以将填充AuxTransformBox
设置为边框线宽的一半。由于填充是以fontsize为单位给出的,因此需要将字体大小设置为线宽并将填充设置为0.5,pad
。请注意,看起来0.52的稍大填充看起来更好;无论如何,这可以根据自己的喜好进行调整。
听起来很复杂,但代码是copy和pastable,可以在任何通常使用Rectangle的地方使用。
pad=0.5,fontsize=linewidth