2012-02-05 12 views
4

私はmatplotlibで2つのパラメータの関数をプロットしています。私はmatplotlibチュートリアルの例をコピーして、私自身の入力データでベクトルXとY(同じく-3:3のスペース番号)とZ =ピーク(X、Y)を変換しました。なにが問題ですか?Matplotlib 3Dプロット - 入力データの2D形式ですか?

def peaks(x,y): 
    xsq=x**2 
    ysq=y**2 
    xsq_one=(x+1)**2 
    ysq_one=(y+1)**2 
    m1=3*(1-x)**2 
    m2=10*(x/5-x**3-y**5) 
    m3=1/3 
    return m1*numpy.exp(-xsq-ysq_one)-m2*numpy.exp(-xsq-ysq)-m3*numpy.exp(-xsq_one-ysq) 


from mpl_toolkits.mplot3d import axes3d 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
X=Y=numpy.arange(-3,3,0.01).tolist() 
Z=[] 
for i in range(len(X)): 
Z.append(peaks(X[i],Y[i])) 

ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) 
cset = ax.contour(X, Y, Z, zdir='z', offset=-100) 
cset = ax.contour(X, Y, Z, zdir='x', offset=-40) 
cset = ax.contour(X, Y, Z, zdir='y', offset=40) 

ax.set_xlabel('X') 
ax.set_xlim(-40, 40) 
ax.set_ylabel('Y') 
ax.set_ylim(-40, 40) 
ax.set_zlabel('Z') 
ax.set_zlim(-100, 100) 

plt.show() 

ありがとうございました!

+0

でなければなりませんか? – joaquin

+0

TypeError:入力zは2D配列でなければなりません。 ...関数の評価は1D ... – octoback

答えて

6

meshgridを生成する必要があります。 X、YおよびZは、あなたがどのようなエラーが出るん2D配列

import numpy 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import axes3d 

def peaks(x,y): 
    return x * numpy.sin(y) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
X = Y= numpy.arange(-3, 3, 0.1).tolist() 
X, Y = numpy.meshgrid(X, Y) 

Z = [] 
for i in range(len(X)): 
    Z.append(peaks(X[i],Y[i])) 

ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) 
cset = ax.contour(X, Y, Z, zdir='z', offset=-8) 
cset = ax.contour(X, Y, Z, zdir='x', offset=-8) 
cset = ax.contour(X, Y, Z, zdir='y', offset=8) 

ax.set_xlabel('X') 
ax.set_xlim(-8, 8) 
ax.set_ylabel('Y') 
ax.set_ylim(-8, 8) 
ax.set_zlabel('Z') 
ax.set_zlim(-8, 8) 

plt.show() 

enter image description here

+0

これは開始でなければなりませんが、このコードではエラーが発生します(上記のピーク機能を参照) TypeError:長さ1の配列のみをPythonスカラーに変換する I他の場所でmeshgridしようとします。 – octoback

+0

numpy.exp()しました。ありがとう – octoback

関連する問題