2016-03-19 3 views
4

私はそれがX-Y平面上に完全な関数meshgridではないのですが、トップビューから隅が欠けていることmatplotlibの examplePython:Matplotlibで「部分」サーフェスプロットをプロットする方法はありますか?

ノートでは、次のような「部分」の表面プロットをプロットしたかったです。次のコードは試してみましたが動作しませんでした。

import numpy as np 
from matplotlib import pyplot 
from mpl_toolkits.mplot3d import Axes3D 

X = np.array([[0,1], 
       [0,1,2], 
       [0,1,2,3], 
      ]) 
Y = np.array([[0,0], 
       [1,1,1], 
       [2,2,2,2], 
      ]) 
Z = np.array([[0.5, 0.6], 
       [0.7, 0.8, 0.9], 
       [1.0, 1.1, 1.2, 1.3], 
      ]) 
fig = pyplot.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(X,Y,Z) 

エラービーイング:

ValueError: setting an array element with a sequence.

どれポインタをいただければ幸いです! ありがとう!

答えて

4

プロットしたくない領域でZの値をnp.nanにすると簡単にこれを行うことができます。また、私はplotコマンドでvminvmaxキーワードを使用していたか、色のスケーリングがスローされることをここに

enter image description here

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
X = np.arange(-5, 5, 0.25) 
Y = np.arange(-5, 5, 0.25) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(.5*R) 

Z[X+Y>4.] = np.nan # the diagonal slice 

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, 
         linewidth=0, antialiased=False, vmin=-1, vmax=1) 
ax.set_zlim(-1.01, 1.01) 

ax.zaxis.set_major_locator(LinearLocator(10)) 
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) 

fig.colorbar(surf, shrink=0.5, aspect=5) 

plt.show() 

注:ここではthis exampleのが、カットで修正されたバージョンは、以下のショーとして、ですナンで

+0

清潔なソリューション!私はこれを試し続けましたが、欠けている値に対処するための限界を設定しなければならないことは分かりませんでした。 – Crebit

+0

@クレジット:ありがとう。 matplotlibは限界計算でナンを無視できるはずです。バグ報告や機能要求の価値があるかもしれません。 – tom10

0

サブアレイの長さは同じでなければなりません。例:

X = np.array([[0,1,0,0], 
       [0,1,2,0], 
       [0,1,2,3] 
      ]) 

などです。

+0

現在のところ、私の解決策は、少なくともこれらのスポットを0で埋めることです。しかし、0はグラフに表示されます。すべての0は「何もない」と同じではありません。 – Shawn

+0

ああ、私は参照してください。しかし、私は一般的に何かを不連続にプロットすることはできないと思う。そして、私が知る限り、三角行列は「三角でない」部分のためにゼロから構成されます。 – MEVIS3000

+0

ああ、ありがとう!私はちょうどそれがどのように見えるかを説明しようとしていた。私は混乱しないように編集します。 – Shawn

1

編集:tom10の答えをご覧ください。彼の解決法は、除外された部分の値をnp.nansに設定することによって機能します。

matplotlibのplot_surfaceはnp.nansを座標として受け入れないので、どちらも動作しません。

MEVIS3000のように "切り取り"ポイントをゼロに設定するのではなく、その寸法の最後の値に設定すると、 2次元配列はすべて同じサイズになり、サーフェスはそこにあるように見えます。

例にデータポイントを追加して明確にしました。我々は交換するように、我々はアレイを調整する場合、今 Pic 1: surface with original data

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 


X = np.array([[0, 1, 2, 3, 4, 5], 
       [0, 1, 2, 3, 4, 5], 
       [0, 1, 2, 3, 4, 5], 
      ]) 
Y = np.array([[0, 0, 0, 0, 0, 0], 
       [1, 1, 1, 1, 1, 1], 
       [2, 2, 2, 2, 2, 2], 
      ]) 
Z = np.array([[0.5, 0.4, 0.35, 0.32, 0.312, 0.3], 
       [0.9, 0.7, 0.60, 0.55, 0.525, 0.5], 
       [1.0, 1.1, 1.20, 1.30, 1.400, 1.5], 
      ]) 


fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(X,Y,Z) 

plt.show() 

得られた表面は、(上方から)次のようになります。これは、(表面全体が表示されている)の出発点であります我々は、表面の一部を残すことができ、その行の前の値を「欠落」値: :

X = np.array([[0, 1, 2, 2, 2, 2], # Notice the sequence 0, 1, 2, 2, 2... 
       [0, 1, 2, 3, 3, 3], # Here starting from 3 
       [0, 1, 2, 3, 4, 4], # Here starting from 4 
      ]) 
Y = np.array([[0, 0, 0, 0, 0, 0], # Here we don't need to do anything 
       [1, 1, 1, 1, 1, 1], 
       [2, 2, 2, 2, 2, 2], 
      ]) 
Z = np.array([[0.5, 0.4, 0.35, 0.35, 0.35, 0.35], # Here like in X: repeats from 0.35 
       [0.9, 0.7, 0.60, 0.55, 0.55, 0.55], 
       [1.0, 1.1, 1.20, 1.30, 1.40, 1.40], 
      ]) 

は、得られるチャートは(再び同じビューから)次のようになり

これはかなり修正されていませんが、それを行う方法の1つです。私は何とか "カットオフ"を自動化するという問題をあなたに残します。

関連する問題