2012-02-05 2 views
4

Я рисую функцию двух параметров с помощью matplotlib. Я скопировал пример в учебнике matplotlib и преобразовал свои собственные входные данные: векторы X и Y (одинаково пробелы в -3: 3) и Z = пики (X, Y) с пиками - это функция, которую я определил. Что не так?Matplotlib 3D plot - 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 должен быть двумерным массивом. ... оценки функций 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

Смежные вопросы