簡體   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