7

我想画一条线,其宽度在数据单元中指定。在这种情况下,只需做

plot(x, y, linewidth=1)

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

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

fill_between(x, y1, y2)

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

那么如果y1y2不共享相同x呢?

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

fill_between(x1, x2, y1, y2)

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

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>

在此处输入图像描述

在这种情况下我应该如何绘制?

4

3 回答 3

7

更简单的,matplotlib.patches.Rectangle

rect = matplotlib.patches.Rectangle((.25, .25), .25, .5, angle=45)
plt.gca().add_patch(rect)
plt.draw()
于 2013-10-18T15:26:14.257 回答
4

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

所有对象下的matplotlib.patch对象是Path.

因此,如果你掌握了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()

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

在此处输入图像描述

于 2013-10-18T08:16:51.330 回答
2

您可以将填充区域绘制为多边形,而不是绘制线条。为此,您需要将andx1的反面连接起来,对andx2执行相同的操作。像这样的东西:y1y2

In [1]: from pylab import *
In [2]: x1 = arange(0,11,2)
In [3]: x2 = arange(0,11)
In [4]: y1 = x1**2+1
In [5]: y2 = x2**2-1
In [6]: xy = c_[r_[x1,x2[::-1]], r_[y1,y2[::-1]]]
In [7]: ax = subplot(111) # we need an axis first
In [8]: ax.add_patch(Polygon(xy))
Out[8]: <matplotlib.patches.Polygon at 0x3bff990>
In [9]: axis([0,10,-10,110]) # axis does not automatically zoom to a patch
Out[9]: [0, 10, -10, 110]
In [10]: show()
于 2013-10-18T07:36:22.867 回答