7

データ単位で指定された幅の線を描きたい。この場合、単純に

plot(x, y, linewidth=1)

linewidthデータ単位で指定されていないため、失敗します。

これを行うには、 を見つけfill_between()ましたが、ここに示されているすべての例は次の形式であることがわかりました

fill_between(x, y1, y2)

つまり、xは常に と によって共有されy1ますy2

では、同じものを共有ない場合はどうなるでしょうか。y1y2x

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

線をプロットする代わりに、塗りつぶされた領域を多角形として描画できます。これを行うにはx1、逆に連結し、x2and に対して同じことを行う必要がy1ありy2ます。このようなもの:

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 に答える