2013-09-16 20 views
5

質問:matplotlibの輪郭線が入力2D配列にどのような順序を想定していますか?matplotlib輪郭入力配列の順番

精巧:matplotlibの輪郭のドキュメントは、ルーチンの呼び出しがscalar_fieldが2D配列でなければなりません

x_axis = np.linspace(10,100,n_x) 
y_axis = np.linspace(10,100,n_y) 
matplotlib.pyplot.contour(x_axis, y_axis, scalar_field) 

であると述べています。 scalar_fieldが輪郭に与えられた場合、例えば、scalar_fieldは

scalar_field = np.array([(x*y) for x in x_axis for y in y_axis]) 
scalar_field = scalar_field.reshape(n_x, n_y) 

によって生成することができ、プロットの

plt.contour(x_axis, y_axis,scalar_field) #incorrect 

方位は(回転)が正しくありません。正しい方向を復元するにはscalar_fieldを転置する必要があります。

plt.contour(x_axis, y_axis,scalar_field.transpose()) #correct 

ので、輪郭がscalar_fieldを持っていることを期待しているためとは何でしょうか?

答えて

5

(x, y)XおよびYとする。あなたは便利numpy.meshgridを使用してXYを作成することができます。

import matplotlib.pyplot as plt 
import numpy as np 

X, Y = np.meshgrid(x_axis, y_axis, copy=False, indexing='xy') 
plt.contour(X, Y, scalar_field)  

引数をindexingは、あなたがしたい場合xが列を表現するラインとyを表すために座標'ij'に変更することができますが、この場合にはscalar_fiedijを使用して計算する必要がありますインデックス作成。

+0

インデックス部分と注文について詳しく教えてください。 – Ivan

+0

@Ivan ''yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyayayayyyyyyyyyyyyyyyayayayay @ Brian場合は、あなたは上から行列を見て、左から右へ行くx座標、下から上にyの座標を見て想像することができますこれはあなたが時々欲しいものではないので、最初のインデックスを行、2番目を列として見ることができる「ij」のインデックスを使用するオプションがあります。 –

2

x値がない行(すなわち、xが横軸であり、yが縦軸である)、列データのに対応することが期待されます。あなたはそれを逆にしました。そのため、zの値を転置して機能させる必要があります。

としてあなたのアレイを作成し、転置を必要避けるために、次にあなたscalar_fieldアレイ内の各点の座標に対応し、あなたがXYためcontour通過また、2次元アレイを用いてプロットべき

scalar_field = np.array([(x*y) for y in y_axis for x in x_axis]) 
scalar_field = scalar_field.reshape(n_y, n_x) 
+0

xとyについて何を言っているのかをドキュメントで説明してください。 – Ivan

+0

matplotlib 1.2.1の 'contour'文書の文字列は、* * X *と* Y *が* Z *と同じ形の2次元でなければならないか、あるいは両方とも' 'len( X) ''は* Z *の列数であり、 '' len(Y) ''は* Z *の行数です。 – bogatron

+0

はい、それはまさに私の質問です。len(x)は_first_インデックスなので、これに従わなければなりません。正解はreshape(n_x、n_y)です。それが混乱する理由です。 – Ivan