是否将matplotlib矩形边设置为指定宽度之外?

ffscu2ro  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(125)

有没有办法为matplotlib的矩形面片指定边界,使边界在指定的域之外?例如,在photoshop中,这被称为“笔划位置”。请允许我用一个例子来说明:

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的域之外?

qv7cva1a

qv7cva1a1#

您可以使用一个AnnotationBbox,其中放置了一个AuxTransformBox。这个AuxTransformBox将包含一个所需大小的代理矩形。它可以设置为不可见(例如fc='none', ec='none')。它唯一的功能是将AuxTransformBox缩放到合适的大小。现在AnnotationBbox可以被赋予一些大线宽的边界。如果它紧靠AuxTransformBox,则边框将仅从AuxTransformBox结束的地方开始。要使边框紧密配合,可以将pad的填充设置为边框线宽的一半。由于填充是以字体大小为单位给出的,需要将fontsize设置为线宽,并将填充设置为0.5,pad=0.5,fontsize=linewidth。注意,在图中,稍微大一点的填充0.52看起来更好;在任何情况下,这可以根据个人喜好进行调整。
听起来很复杂,但是代码是可复制和可粘贴的,可以在通常使用矩形的任何地方使用。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from matplotlib.offsetbox import AnnotationBbox, AuxTransformBox

# 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', aspect="auto")

linewidth = 14
xy, w, h = (0.5, 0.5), 2, 2
r = Rectangle(xy, w, h, fc='none', ec='gold', lw=1)

offsetbox = AuxTransformBox(ax.transData)
offsetbox.add_artist(r)
ab = AnnotationBbox(offsetbox, (xy[0] + w/2., xy[1] + h/2.),
                    boxcoords="data", pad=0.52,fontsize=linewidth,
                    bboxprops=dict(facecolor="none", edgecolor='r', 
                              lw=linewidth))
ax.add_artist(ab)

plt.show()

相关问题