繁体   English   中英

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

[英]Set matplotlib rectangle edge to outside of specified width?

有没有一种方法可以为matplotlib的Rectangle修补程序指定边缘,以使边框位于指定的域之外? 例如,在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的域之外?

您可以使用AnnotationBbox ,并在其中放置AuxTransformBox AuxTransformBox将包含所需大小的代理矩形。 可以使它不可见(例如, fc='none', ec='none' )。 它的唯一功能是将AuxTransformBox到合适的大小。 现在可以给AnnotationBbox一个较大的线宽边框。 如果它紧靠AuxTransformBox则边框仅在AuxTransformBox结束的AuxTransformBox开始。 为了使边框紧密贴合,可以将填充pad设置为边框线宽的一半。 由于填充是以fontsize为单位给出的,因此需要将fontsize设置为线宽,将padding设置为0.5, pad=0.5,fontsize=linewidth 请注意,在图上似乎稍微大一点的填充0.52看起来更好; 在任何情况下都可以根据自己的喜好进行调整。

听起来很复杂,但是代码是可复制且可粘贴的,可以在通常使用Rectangle的任何地方使用。

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]+w/2.),
                    boxcoords="data", pad=0.52,fontsize=linewidth,
                    bboxprops=dict(facecolor = "none", edgecolor='r', 
                              lw = linewidth))
ax.add_artist(ab)


plt.show()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM