2012-01-04 22 views
13

Tengo una función z que acepta los parámetros xey y devuelve una salida z. Quiero trazar esto en 3d y establecer las escalas. ¿Cómo puedo hacer esto fácilmente? Pasé demasiado tiempo revisando la documentación y no veo una forma de hacerlo.Quiero usar matplotlib para hacer un trazado 3d dada una función z

+1

El [capacidad de gráficos 3D] (http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html) en matplotlib solamente se añadió en muy versiones recientes, hasta donde yo sé. –

+0

Ya he consultado esa página y no he podido encontrar ningún ejemplo de pasar una función z arbitraria a un trazador 3D – WhatsInAName

Respuesta

21

El estilo de trazado depende de sus datos (es decir, si intenta trazar una curva 3d, o una superficie, o una dispersión ...), pero esto debería darle un ejemplo práctico para comenzar a jugar.

Básicamente, no pasa la función a la trama, primero crea un dominio de xs y ys, y luego calcula los zs a partir de eso. En mi ejemplo, acabo de utilizar una cuadrícula simple de puntos espaciados uniformemente en el plano x-y para el dominio.

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import random 

def fun(x, y): 
    return x + y 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
n = 10 
xs = [i for i in range(n) for _ in range(n)] 
ys = range(n) * n 
zs = [fun(x, y) for x,y in zip(xs,ys)] 

ax.scatter(xs, ys, zs) 

ax.set_xlabel('X Label') 
ax.set_ylabel('Y Label') 
ax.set_zlabel('Z Label') 

plt.show() 

enter image description here


Para superficies que es un poco diferente, se pasa en una rejilla para el dominio en matrices 2D. Aquí está un ejemplo de superficie lisa:

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import random 

def fun(x, y): 
    return x**2 + y 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
x = y = np.arange(-3.0, 3.0, 0.05) 
X, Y = np.meshgrid(x, y) 
zs = np.array([fun(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))]) 
Z = zs.reshape(X.shape) 

ax.plot_surface(X, Y, Z) 

ax.set_xlabel('X Label') 
ax.set_ylabel('Y Label') 
ax.set_zlabel('Z Label') 

plt.show() 

enter image description here

+0

Por alguna razón, cuando cambio la función, el gráfico se mantiene prácticamente igual. ¿Hay alguna manera de hacer una superficie lisa? – WhatsInAName

+0

OK, actualicé mi respuesta con una superficie parabólica inclinada. – wim

+1

Para el último gráfico, ¿hay alguna manera de colorear la superficie de acuerdo con z? Decir, usando un cloropleth? –

Cuestiones relacionadas