2012-06-09 12 views
6

私はmatplotlibで半径に依存するアルファ(不透明度)値を持つ塗りつぶし色で楕円を作成したいと思います。matplotlibパッチの色勾配?

例えば、2Dガウス。

これを実行する方法はありますか?

簡単に十分な(Gradient facecolor matplotlib bar plotthisのような)色のグラデーションで長方形のプロットを作成することが可能であるが、私は、円/楕円のために同じことを行う方法を見つけ出すことはできません。

答えて

7

機能ですアレックスのポストから

import matplotlib.pyplot as plt,numpy as np 

def gauplot(centers, radiuses, xr=None, yr=None): 
     nx, ny = 1000.,1000. 
     xgrid, ygrid = np.mgrid[xr[0]:xr[1]:(xr[1]-xr[0])/nx,yr[0]:yr[1]:(yr[1]-yr[0])/ny] 
     im = xgrid*0 + np.nan 
     xs = np.array([np.nan]) 
     ys = np.array([np.nan]) 
     fis = np.concatenate((np.linspace(-np.pi,np.pi,100), [np.nan])) 
     cmap = plt.cm.gray 
     cmap.set_bad('white') 
     thresh = 3 
     for curcen,currad in zip(centers,radiuses): 
       curim=(((xgrid-curcen[0])**2+(ygrid-curcen[1])**2)**.5)/currad*thresh 
       im[curim<thresh]=np.exp(-.5*curim**2)[curim<thresh] 
       xs = np.append(xs, curcen[0] + currad * np.cos(fis)) 
       ys = np.append(ys, curcen[1] + currad * np.sin(fis)) 
     plt.imshow(im.T, cmap=cmap, extent=xr+yr) 
     plt.plot(xs, ys, 'r-') 

そしてここにアイデアを使用した例では、

gauplot([(0,0), (2,3), (5,1), (6, 7), (6.1, 6.1)], [.3,. 4, .5, 1, .4], [-1,10], [-1,10]) 
      #   centers of circles   # radii of circles# 

plot

+0

私はアプローチが好きです - 私はそれを自分で考えていましたが、いくつかの理由でそれを拒否しました。 1.ログログプロットでは機能しません(パッチはうまく動作しませんが、試行します)。2.プロット境界の事前知識が必要です。(これは回避できますが)3.かなり遅いです。それでも、今のところ私はそれに巻き込まれるでしょう。 – keflavich

+0

Iは、関数imshowの原点は左下隅、 'plt.imshow(im.T、CMAP = CMAP、エクステント= XR +年、原点= "低級")'でなければならないと思います。 – ImportanceOfBeingErnest

6

私はmatplotlibは現在、グラデーションをサポートしていないと思うパッチの塗りつぶし - this emailを参照してください。

john>こんにちは、こんにちは、私は単色の代わりに塗りつぶしパターンでバー(パッチ矩形のシリーズ)を設定しようとしています。 matplotlibでこれを行う簡単な方法はありますか?
john>私は、クロス、垂直、密などのパターンを持つQtのQBrushのようなものを考えています。

このためのサポートは現在ありません - この種のものをサポートするバックエンドのための追加 にあまりにもハードではないでしょう。基本的には、APIを指定してバックエンドにサポートを追加するには が必要です。私は(例えば多角形、長方形) パッチの塗りつぶしグラデーションを追加したい てきた、両方を一度に行うことが良いでしょう。


代わりにあなたがメッシュを作成することができるパッチを使用した、機能と色を計算し、その後補間でimshowを使用します。

# Taken from http://matplotlib.sourceforge.net/examples/pylab_examples/layer_images.html 

def func3(x,y): 
    return (1- x/2 + x**5 + y**3)*exp(-x**2-y**2) 

# make these smaller to increase the resolution 
dx, dy = 0.05, 0.05 

x = arange(-3.0, 3.0, dx) 
y = arange(-3.0, 3.0, dy) 
X,Y = meshgrid(x, y) 

xmin, xmax, ymin, ymax = amin(x), amax(x), amin(y), amax(y) 
extent = xmin, xmax, ymin, ymax 

fig = plt.figure(frameon=False) 

Z2 = func3(X, Y) 

im2 = imshow(Z2, cmap=cm.jet, alpha=.9, interpolation='bilinear', extent=extent) 

show() 

これは以下になります(市松模様の背景を無視します) :ここでは

http://matplotlib.sourceforge.net/_images/layer_images.png

+0

を実行し、あなたが望む透明パッチで白いマスクのz-中間を入れたときに、あなたが得るものです平らな背景にグラデーションパッチのようなものを得るために、マーカーを使用します。 – cphlewis