2017-01-18 5 views
0

matplotlibのmpl_toolkits.mplot3d plot_surface関数を使用して3Dサーフェスをプロットしようとしています。 私の変数Z(関数f(x、y))はかなり複雑で、一度メッシュ化すればXとYの関数として書くことができないので、xを通るループを使って2次元配列として計算します私はこの配列Zをplot_surface関数の呼び出しに渡していますが、基本的にはZの図形を期待していますが、Zに対応する図形を得るため、基本的には間違った図形が得られます。転置。matplotlibが3Dプロット内の行列の転置をプロットするのはなぜですか?

私は下に私の問題を再現はるかに簡単な例を行うことができました:だから

X = range(5) 
Y = range(5) 
X,Y = np.meshgrid(X,Y) 
mysol = np.array([[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]]) 
fig1 = plt.figure(1) 
ax = fig1.add_subplot(111, projection='3d') 
surf = ax.plot_surface(X, Y, mysol, rstride=1, cstride=1, cmap=cm.coolwarm) 
ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 
plt.show() 

enter image description hereを、私は、x = 0のとき、私はmysol [0を得るように、これはプレーンを生成することを期待してい,: ] = [1,1,1,1,1](私の行列mysolの最初の行)。代わりに、このコードによって生成されたグラフを見ると、x = 0のとき、行列の最初の列が得られます(mysol [:、0] = [1,2,3,4,5])。

私はmysol.transpose()をmysolとは反対にプロットすると問題が解決されることを理解していますが、ここでロジックを理解しようとしています。 。いない列方向どこに私のミスで事前に

おかげで、あなたのmeshgridの結果で

答えて

1

ルック:?

>>> np.meshgrid(range(5), range(5)) 
[array([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]]), 
array([[0, 0, 0, 0, 0], 
     [1, 1, 1, 1, 1], 
     [2, 2, 2, 2, 2], 
     [3, 3, 3, 3, 3], 
     [4, 4, 4, 4, 4]])] 

最初の配列はあなたがXに割り当てたもので、2番目の配列はYに割り当てられたものです.Xが列を横切って増加し、Yが行を増加させることが分かります。

あなたの質問に対する答えは、デフォルトでは、meshgridは行の座標ではなくXYの座標を返します。座標系で数学をする場合、通常はXY座標系が必要です。しかし、もしあなたが望むなら、indexing='ij'引数を渡すことによって、meshgridが行列形式の座標を返すようにすることができます。

1

Matplotlibはnumpyを使用し、numpyの規則に非常に密接に関連しています。

numpy配列のインデックスを作成すると、a[j,i]j番目の行とi番目の列にエントリを与えます。したがって、jは垂直座標で、iは水平座標です。識別する

horizontal <-> x <-> i 
vertical <-> y <-> j 

イメージが印刷された用紙のアレイのように正確に見えることを保証します。これらの2D配列で作業するのは非常に快適です。

これはまさにあなたが画像で見るものです。

enter image description here

+0

あなたのイメージはプロットのデータに対応していません。彼のプロットでは、赤い行はY = 4にありますが、イメージでは赤の行はY = 0にあります。 – BrenBarn

+0

@BrenBarn私の画像は 'coolwarm'(' RdBu'は赤で始まり、 'coolwarm'は青で始まります)を使っている間に' RdBu'カラーマップを使います。しかし、この問題の全体的な点は、質問の画像を再現するのではなく、画像とその基礎となる配列がどのように関連しているかを示すことです。つまり、 'y'は行、' x'は列です。これを見るために、カラーマップは無関係です。 – ImportanceOfBeingErnest

関連する問題