2012-01-04 9 views
13

私はxとyのパラメータを受け取り、zの出力を返すz関数を持っています。私はこれを3Dでプロットし、スケールを設定したいと思います。どうやってこれを簡単にすることができますか?私はドキュメントを見て、あまりにも多くの時間を過ごしましたが、一度これを行う方法はありません。私はmatplotlibを使ってz関数を与えられた3次元プロットを作成したい

+1

[3Dプロットの能力(http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html)matplotlibのには非常に添加しました最近のバージョン、私が知る限り。 –

+0

私は既にそのページを見て、任意のz関数を3次元プロッタに渡す例は見つけられませんでした – WhatsInAName

答えて

21

プロットスタイルの種類はデータに依存します(つまり、3Dカーブやサーフェス、散布などをプロットしようとしていますか?)が、演奏を開始するための実例が必要です。

基本的には、関数をプロットに渡さないで、まずxsとysのドメインを作成し、それからzsを計算します。私の例では、ドメインのx-y平面に等間隔に配置された点の単純なグリッドを使用しました。表面のために


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() 
それはあなたが2D配列内のドメインのためのグリッドに渡し、少し違うのです。ここで、滑らかな表面の例は次のとおり

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

何らかの理由で、関数を変更してもグラフはほとんど変わらないでしょうか?滑らかな表面を作る方法はありますか? – WhatsInAName

+0

OK、傾斜のある放物面で答えを更新しました。 – wim

+1

最後のグラフについては、zに沿ってサーフェスをカラーリングする方法はありますか?言ってやるがいい。 –

関連する問題