2016-06-17 14 views
3

私は、とにかく(つまり、私はそれを求めるために、正確に方法がわからない)私は右の命名法を持っていないかもしれないので、この上で何かを見つけることができていますが、していません3D numpy配列 "a"を持つ。私は、a = 0の2Dサーフェスを特定しプロットしたいと思います。明確にするために、データは、3D空間上で滑らかに変化する倍精度浮動小数です。面A = 0は、アレイのポイントではなく、「間のスレッドは、」正確にそれらのいずれかに右にある可能性が高いです。ですから、a = 0のサーフェスを見つけてプロットするために補間できるものが必要です。 matplotlibにはこれを行うための既製のルーチンがありますか?matplotlibの2次元スライス

+0

これは、私はあなたがボリュームスライサーをしたいと考えているnumpyのscipyのダウンロードまたは事 – kilojoules

+2

のより多くのように思えます。 numpy、scipy、matplotlib(私が知る限り)は、デフォルトでこれを行う準備ができていません。あなたは層の間にスライスを計算することはできますが(これがあなたに受け入れられるならば、私は解決策を提示してみてください)それを行うためのコードをビルドする必要があります。それをmatplotlibのに近いライブラリーはそれがMayavi(私は今ためのPython 2.xでそののみ利用可能だと思う)で行います。 pyQtGraph、VTK、Vispyも考えてみることができます。 – armatita

+0

@armatita答えに感謝します。少なくとも今私は何か些細なことを聞​​いていないことを確かに知っている!ボリュームスライシングを行うことができるコードを作成したいのであれば、私は確かにそれを見ることに興味があるでしょう!ありがとう。 –

答えて

2

"a = 0"の2Dサーフェスを特定してプロットするには、a=0とplot(下に表示)のデータをサブセット化するだけです。データをその平面に投影する場合は、少し複雑です。

threeD = np.array([(x,y,z) for x in [0,1] for y in [1,2] for z in [5,6]]) 
twoD = np.array([(y,z) for (x,y,z) in threeD if x==0]) 
y,z = zip(*twoD) 
plt.plot(y,z, 'o') 
plt.xlim(0,3) 
plt.ylim(0,7) 

enter image description here

+0

私の質問は十分にはっきりしていないと思います。編集中。 –

0

ボリュームスライシング操作は、通常、補間の概念に依存しており、最も一般的には、次のとおりNearest neighborLinear、及びCubic。これらの方法は寸法のさらなる数(例えばBilinear又はTrilinear補間を参照)に適合している注意してください。

このケースでは、X、Y、Zのスライスを取得できるボリュームがあると言っています(またはハイブリッドですが、新しい問題全体からこのケースを考慮せず混乱させます)。

そう考えると、一例として、スライスX = 5とX = 6あなたはX = 5.5取得する方法を知りたいです。例に見てみましょう:

def linear_interpolation(p1, p2, x0): 
    """ 
    Function that receives as arguments the coordinates of two points (x,y) 
    and returns the linear interpolation of a y0 in a given x0 position. This is the 
    equivalent to obtaining y0 = y1 + (y2 - y1)*((x0-x1)/(x2-x1)). 
    Look into https://en.wikipedia.org/wiki/Linear_interpolation for more 
    information. 

    Parameters 
    ---------- 
    p1  : tuple (floats) 
     Tuple (x,y) of a first point in a line. 
    p2  : tuple (floats) 
     Tuple (x,y) of a second point in a line. 
    x0  : float 
     X coordinate on which you want to interpolate a y0. 

    Return float (interpolated y0 value) 
    """ 
    return p1[1] + (p2[1] - p1[1]) * ((x0 - p1[0])/(p2[0] - p1[0])) 

X, Y, Z = np.meshgrid(range(10), range(10), range(10)) 
vol = np.sqrt((X-5)**2 + (Y-5)**2 + (Z-5)**2) 

Slice5dot5 = linear_interpolation((Y[5, :, :], vol[5, :, :]), (Y[6, :, :], vol[6, :, :]), 5.5) 

f, (ax1, ax2, ax3) = plt.subplots(1, 3, sharey=True) 
ax1.imshow(vol[5, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max()) 
ax1.set_title("vol[5, :, :]") 
ax2.imshow(Slice5dot5, interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max()) 
ax2.set_title("vol[5.5, :, :]") 
ax3.imshow(vol[6, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max()) 
ax3.set_title("vol[6, :, :]") 
plt.show() 

機能は、(私は古いプロジェクトのその一部)に文書番号を使用することが、それはnumpyの2Dスライスと同じようにうまく動作します(と、それは非常になります表示されますすべてのセルをループするよりも速い)。

結果は、このでした:

Volume slicing matplotlib

あなたは、左から右に淡い色を得ることに気づくでしょう。中央のスライスは完全に補間され、以前は存在しませんでした。あなたはボリュメトリックデータに平面と非線形スライスの両方をプロットすることができPlotlyで

関連する問題