2012-02-05 6 views
4

Je suis en train de tracer une fonction de deux paramètres avec matplotlib. J'ai copié un exemple dans le tutoriel matplotlib et je l'ai transformé avec mes propres données d'entrée: vecteurs X et Y (espaces également nombres -3: 3) et Z = pics (X, Y) avec pics une fonction que j'ai définie avant. Qu'est-ce qui ne va pas?Tracé 3D Matplotlib - format 2D pour les données d'entrée?

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() 

Merci pour le conseil!

+0

quelle erreur que vous obtenez? – joaquin

+0

TypeError: L'entrée z doit être un tableau 2D. ... les évaluations des fonctions sont 1D ... – octoback

Répondre

6

Vous devez générer le meshgrid. X, Y et Z doivent être des tableaux 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

ça doit être un début, mais avec ce code, j'ai une erreur (avec fonction de crête propre, voir ci-dessus) TypeError: seule la longueur-1 tableaux peuvent être convertis en scalaires Python I vais essayer de meshgrid ailleurs – octoback

+0

numpy.exp() l'a fait; Merci – octoback

Questions connexes