2012-01-04 17 views
13

Mam funkcję z, która akceptuje parametry x i y i zwraca wynik z. Chcę to wykreślić w 3d i ustawić skalę. Jak mogę to łatwo zrobić? Spędziłem zbyt dużo czasu przeglądając dokumentację i ani razu nie widzę sposobu, aby to zrobić.Chcę użyć matplotlib do utworzenia wykresu 3d z funkcją z

+1

Sieć [zdolność do wykres 3D] (http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html) w matplotlib dodano w bardzo najnowsze wersje, o ile wiem. –

+0

Już obejrzałem tę stronę i nie mogłem znaleźć żadnego przykładu przekazania dowolnej funkcji z do plotera 3d. – WhatsInAName

Odpowiedz

21

Rodzaj stylu kreślenia zależy od danych (np. Czy próbujesz wykreślić krzywą 3d, powierzchnię lub rozproszenie ...), ale powinno to dać ci przykład do rozpoczęcia gry.

Zasadniczo nie przekazuje się funkcji do wykresu, najpierw należy utworzyć domenę xs i ys, a następnie obliczyć wartość zs. W moim przykładzie użyłem prostej siatki równomiernie rozmieszczonych punktów w płaszczyźnie x-y dla domeny.

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


Na powierzchni jest nieco inna, przechodzą w siatce dla domeny w 2D tablic. Oto przykład gładka powierzchnia:

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

Z jakiegoś powodu, kiedy zmieniam funkcję, wykres pozostaje taki sam? Czy istnieje sposób na zrobienie gładkiej powierzchni? – WhatsInAName

+0

OK, zaktualizowałem swoją odpowiedź nachyloną paraboliczną powierzchnią. – wim

+1

Dla ostatniego wykresu, czy istnieje sposób na kolorowanie powierzchni zgodnie z Z? Powiedz, używając cloropleth? –

Powiązane problemy