2012-01-04 17 views
13

x ve y parametrelerini kabul eden bir z işlevim var ve bir z çıktısı döndürüyor. Bunu 3d olarak çizmek ve ölçekleri ayarlamak istiyorum. Bunu nasıl kolayca yapabilirim? Belgeleri incelemek için çok fazla zaman harcadım ve bir kez bunu yapmanın bir yolunu görmüyorum.Bir z işlevi verilen bir 3d çizim yapmak için matplotlib kullanmak istiyorum

+1

[3D araziler için yeteneği] (http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html) matplotlib sadece çok eklenmiştir: İşte pürüzsüz bir yüzey örneği Bildiğim kadarıyla yeni sürümler. –

+0

Bu sayfaya zaten baktım ve bir 3d plotter'e rastgele bir z-function geçirme örneği bulamadım – WhatsInAName

cevap

21

Çizim stili, verilerinize bağlıdır (yani, bir 3B eğri veya bir yüzey veya bir dağılım çizmeye çalışıyorsunuz ...), ancak bu, oynamaya başlamak için size bir çalışma örneği vermelidir.

Temel olarak, işlevi arsaya aktarmazsınız, önce bir xs ve ys etki alanı yaratırsınız ve sonra z'leri bundan hesaplarsınız. Örneğimde, sadece alan için x-y düzleminde eşit aralıklı basit bir ızgara kullandım. yüzeyler için


enter image description here

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() 
Eğer 2d dizilerde etki alanı için bir tablo içinde geçmesi biraz farklıdır.

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

Fonksiyonu değiştirdiğimden dolayı, grafik hemen hemen aynı kalıyor mu? Düzgün bir yüzey yapmak için herhangi bir yolu var mı? – WhatsInAName

+0

Tamam, cevabımı eğimli bir parabolik yüzeyle güncelledim. – wim

+1

Son grafik için, yüzeye z'ye göre renklendirmenin bir yolu var mı? Bir kloroplet kullanarak mı? –

İlgili konular