2012-01-04 9 views
13

Ho una funzione z che accetta parametri xey restituisce un output z. Voglio tracciare questo in 3d e impostare le scale. Come posso farlo facilmente? Ho passato troppo tempo a esaminare la documentazione e non una volta vedo un modo per farlo.Voglio usare matplotlib per creare un grafico 3d data una funzione z

+1

Il [funzionalità per i grafici 3D] (http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html) in matplotlib è stato aggiunto solo in molto versioni recenti, per quanto ne so. –

+0

Ho già guardato quella pagina e non sono riuscito a trovare alcun esempio di passaggio di una funzione z arbitraria a un plotter 3d – WhatsInAName

risposta

21

Il tipo di stile di stampa dipende dai dati (cioè si sta tentando di tracciare una curva 3D, o una superficie, o una dispersione ...), ma questo dovrebbe darvi un esempio funzionante per iniziare a giocare.

Fondamentalmente, non si passa la funzione alla trama, prima si crea un dominio di xs e ys, quindi si calcola zs da quello. Nel mio esempio ho appena usato una semplice griglia di punti equidistanti nel piano x-y per il 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


Per superfici che è un po 'diverso, si passa in una griglia per il dominio in matrici 2D. Ecco un esempio di superficie liscia:

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

Per qualche motivo quando cambio la funzione, il grafico praticamente rimane lo stesso? C'è un modo per fare solo una superficie liscia? – WhatsInAName

+0

OK, ho aggiornato la mia risposta con una superficie parabolica inclinata. – wim

+1

Per l'ultimo grafico, c'è un modo per colorare la superficie in base a z? Di ', usando un cloropleto? –

Problemi correlati