将matplotlib矩形边设置为指定宽度的外部?

时间:2015-05-06 15:58:57

标签: python matplotlib

有没有办法为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()

这产生以下结果:

enter image description here

但是,如果修改如下

ax.add_patch( Rectangle((0.5, 0.5), 2, 2, fc='none', ec='r', lw=10) )

我得到了这个数字:

enter image description here

如您所见,边缘沿着Rectangle对象域的边界居中定位,因此渗入此域。是否可以强制边缘边界严格位于Rectangle域之外?

1 个答案:

答案 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

enter image description here