无法在 matplotlib 的绘图上绘制具有 "Width" 属性的边界框?
Not able to draw a bounding box with "Width" attribute on the matplotlib's plot?
我正在尝试在文本中绘制边界框,例如:
from matplotlib.pyplot import text
from matplotlib.patches import FancyBboxPatch
import matplotlib.transforms as mtransforms
import numpy as np
import matplotlib.pyplot as plt
def draw_bbox(ax, bb):
# boxstyle=square with pad=0, i.e. bbox itself.
p_bbox = FancyBboxPatch((bb.xmin, bb.ymin),
abs(bb.width), abs(bb.height),
boxstyle="round,pad=0.1, rounding_size=0.2",
ec="k", fc="none", zorder=10.,facecolor='pink')
ax.add_patch(p_bbox)
np.random.seed(19680801)
fig, ax = plt.subplots()
x = 30*np.random.randn(10000)
mu = x.mean()
median = np.median(x)
sigma = x.std()
textstr = '\n'.join((
r'$\mu=%.2f$' % (mu, ),
r'$\mathrm{median}=%.2f$' % (median, ),
r'$\sigma=%.2f$' % (sigma, )))
ax.hist(x, 50)
# these are matplotlib.patch.Patch properties
props = dict(boxstyle='square, pad=0.2', facecolor='wheat', alpha=0.5 )
# place a text box in upper left in axes coords
ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14,
verticalalignment='top', bbox=props
)
plt.show()
在文档中 matplotlib.pyplot.text
return 一个 Text 实例,它可以接受一个 kwarg 'bbox' . and this bbox argument accepts a dict() type object with properties for patches.FancyBboxPatch 。 FancyBboxPatch 有一个位置 arg 宽度,如果我试图给出,
props2 =FancyBboxPatch(xy=(0., 0.),width=1.,height=1.,boxstyle='Round, pad=0.2', facecolor='pink', alpha=0.5 )
ax.text(0.1, 0.95, textstr, transform=ax.transAxes, fontsize=14,
verticalalignment='top', bbox=props2
)
它给出了以下错误:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-59-0c8ad0d773a9> in <module>
32 props2 =FancyBboxPatch((0., 0.),1.,1.,boxstyle='Round, pad=0.2', facecolor='pink', alpha=0.5 )
33 ax.text(0.1, 0.95, textstr, transform=ax.transAxes, fontsize=14,
---> 34 verticalalignment='top', bbox=props2
35 )
36
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\cbook\deprecation.py in wrapper(*args, **kwargs)
367 f"%(removal)s. If any parameter follows {name!r}, they "
368 f"should be pass as keyword, not positionally.")
--> 369 return func(*args, **kwargs)
370
371 return wrapper
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\axes\_axes.py in text(self, x, y, s, fontdict, withdash, **kwargs)
781 else:
782 t = mtext.Text(x, y, text=s)
--> 783 t.update(effective_kwargs)
784
785 t.set_clip_path(self.patch)
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\text.py in update(self, kwargs)
177 super().update(kwargs)
178 if bbox is not sentinel:
--> 179 self.set_bbox(bbox)
180
181 def __getstate__(self):
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\text.py in set_bbox(self, rectprops)
443
444 if rectprops is not None:
--> 445 props = rectprops.copy()
446 boxstyle = props.pop("boxstyle", None)
447 pad = props.pop("pad", None)
AttributeError: 'FancyBboxPatch' object has no attribute 'copy'
这个错误对我来说没有意义。我觉得这是 FancyBboxPatch 实现中的错误?
任何人都可以帮助找到问题吗?
以下将在坐标轴的左上角彼此下方添加两个文本。框的宽度为 200 像素,与文本大小无关。
import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredOffsetbox, HPacker, VPacker, TextArea, PaddedBox
fig, ax = plt.subplots()
text1 = TextArea("Short\nText")
of1 = HPacker(width=200, height=None, pad=2, sep=5, align="center", mode="expand", children=[text1])
pb1 = PaddedBox(of1, pad=4, draw_frame=True)
text2 = TextArea("Long text in one line")
of2 = HPacker(width=200, height=None, pad=2, sep=5, align="center", mode="expand", children=[text2])
pb2 = PaddedBox(of2, pad=4, draw_frame=True)
oft = VPacker(width=200, height=None, pad=2, sep=5, align="baseline", children=[pb1, pb2])
t = AnchoredOffsetbox("upper left", pad=0.4, frameon=False, child=oft)
ax.add_artist(t)
plt.show()
我正在尝试在文本中绘制边界框,例如:
from matplotlib.pyplot import text
from matplotlib.patches import FancyBboxPatch
import matplotlib.transforms as mtransforms
import numpy as np
import matplotlib.pyplot as plt
def draw_bbox(ax, bb):
# boxstyle=square with pad=0, i.e. bbox itself.
p_bbox = FancyBboxPatch((bb.xmin, bb.ymin),
abs(bb.width), abs(bb.height),
boxstyle="round,pad=0.1, rounding_size=0.2",
ec="k", fc="none", zorder=10.,facecolor='pink')
ax.add_patch(p_bbox)
np.random.seed(19680801)
fig, ax = plt.subplots()
x = 30*np.random.randn(10000)
mu = x.mean()
median = np.median(x)
sigma = x.std()
textstr = '\n'.join((
r'$\mu=%.2f$' % (mu, ),
r'$\mathrm{median}=%.2f$' % (median, ),
r'$\sigma=%.2f$' % (sigma, )))
ax.hist(x, 50)
# these are matplotlib.patch.Patch properties
props = dict(boxstyle='square, pad=0.2', facecolor='wheat', alpha=0.5 )
# place a text box in upper left in axes coords
ax.text(0.05, 0.95, textstr, transform=ax.transAxes, fontsize=14,
verticalalignment='top', bbox=props
)
plt.show()
在文档中 matplotlib.pyplot.text
return 一个 Text 实例,它可以接受一个 kwarg 'bbox' . and this bbox argument accepts a dict() type object with properties for patches.FancyBboxPatch 。 FancyBboxPatch 有一个位置 arg 宽度,如果我试图给出,
props2 =FancyBboxPatch(xy=(0., 0.),width=1.,height=1.,boxstyle='Round, pad=0.2', facecolor='pink', alpha=0.5 )
ax.text(0.1, 0.95, textstr, transform=ax.transAxes, fontsize=14,
verticalalignment='top', bbox=props2
)
它给出了以下错误:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-59-0c8ad0d773a9> in <module>
32 props2 =FancyBboxPatch((0., 0.),1.,1.,boxstyle='Round, pad=0.2', facecolor='pink', alpha=0.5 )
33 ax.text(0.1, 0.95, textstr, transform=ax.transAxes, fontsize=14,
---> 34 verticalalignment='top', bbox=props2
35 )
36
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\cbook\deprecation.py in wrapper(*args, **kwargs)
367 f"%(removal)s. If any parameter follows {name!r}, they "
368 f"should be pass as keyword, not positionally.")
--> 369 return func(*args, **kwargs)
370
371 return wrapper
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\axes\_axes.py in text(self, x, y, s, fontdict, withdash, **kwargs)
781 else:
782 t = mtext.Text(x, y, text=s)
--> 783 t.update(effective_kwargs)
784
785 t.set_clip_path(self.patch)
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\text.py in update(self, kwargs)
177 super().update(kwargs)
178 if bbox is not sentinel:
--> 179 self.set_bbox(bbox)
180
181 def __getstate__(self):
~\AppData\Local\Continuum\anaconda3\envs\automation_work\lib\site-packages\matplotlib\text.py in set_bbox(self, rectprops)
443
444 if rectprops is not None:
--> 445 props = rectprops.copy()
446 boxstyle = props.pop("boxstyle", None)
447 pad = props.pop("pad", None)
AttributeError: 'FancyBboxPatch' object has no attribute 'copy'
这个错误对我来说没有意义。我觉得这是 FancyBboxPatch 实现中的错误? 任何人都可以帮助找到问题吗?
以下将在坐标轴的左上角彼此下方添加两个文本。框的宽度为 200 像素,与文本大小无关。
import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredOffsetbox, HPacker, VPacker, TextArea, PaddedBox
fig, ax = plt.subplots()
text1 = TextArea("Short\nText")
of1 = HPacker(width=200, height=None, pad=2, sep=5, align="center", mode="expand", children=[text1])
pb1 = PaddedBox(of1, pad=4, draw_frame=True)
text2 = TextArea("Long text in one line")
of2 = HPacker(width=200, height=None, pad=2, sep=5, align="center", mode="expand", children=[text2])
pb2 = PaddedBox(of2, pad=4, draw_frame=True)
oft = VPacker(width=200, height=None, pad=2, sep=5, align="baseline", children=[pb1, pb2])
t = AnchoredOffsetbox("upper left", pad=0.4, frameon=False, child=oft)
ax.add_artist(t)
plt.show()