matplotlib - 如何绘制随机导向的矩形(或任何形状)?

6 python matplotlib

我想绘制一条宽度在数据单元中指定的线.在这种情况下,干脆做

plot(x, y, linewidth=1)
Run Code Online (Sandbox Code Playgroud)

会失败,因为linewidth数据单元中没有指定.

为此,我找到了fill_between(),但我发现这里给出的所有例子都是格式

fill_between(x, y1, y2)
Run Code Online (Sandbox Code Playgroud)

这意味着,x总是由y1和共享y2.

那么如果y1y2不共享x呢?

例如,我希望填充line1=[(0, 0), (2, 2)]line2=[(-1, 1), (1, 3)](基本上,它们形成一个矩形).在这种情况下,我想要类似的东西

fill_between(x1, x2, y1, y2)
Run Code Online (Sandbox Code Playgroud)

显然,它没有按预期工作:

In [132]: x1 = [0,2]
   .....: x2 = [-1, 1]
   .....: y1 = [0,2]
   .....: y2 = [1,3]
   .....: fill_between(x1, x2, y1, y2)
   .....: 
Out[132]: <matplotlib.collections.PolyCollection at 0x3e5b230>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在这种情况下我该如何策划?

tac*_*ell 6

更简单, matplotlib.patches.Rectangle

rect = matplotlib.patches.Rectangle((.25, .25), .25, .5, angle=45)
plt.gca().add_patch(rect)
plt.draw()
Run Code Online (Sandbox Code Playgroud)


Sib*_*ing 5

好问题!我建议你不要限制自己的功能fill_between。我始终认为深入了解事物是有益的。让我们深入探讨 Python 绘图的本质。

所有对象的底层对象matplotlib.patchPath.

所以,如果你掌握了Path,你基本上可以用任何方式画出任何你喜欢的东西。现在让我们看看如何通过神奇的Path.

要获得您在问题中提到的矩形,只需对示例进行一些调整即可。

import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches

verts = [(0., 0.), # left, bottom
         (-1., 1.), # left, top
         (1., 3.), # right, top
         (2., 2.), # right, bottom
         (0., 0.),] # ignored

codes = [Path.MOVETO,
         Path.LINETO,
         Path.LINETO,
         Path.LINETO,
         Path.CLOSEPOLY,]

path = Path(verts, codes)
fig = plt.figure()
ax = fig.add_subplot(111)
patch = patches.PathPatch(path, facecolor='orange', lw=2)
ax.add_patch(patch) 
ax.axis('equal')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我认为代码非常简单且不言自明,我不需要在上面浪费我的言语。只需复制、粘贴并运行它,您就会得到这个,正是您想要的。

在此输入图像描述