2016-12-19 19 views
1

3つの座標(x,y,z)をある実数に写像する関数があるとします。関数の値を3次元で可視化するにはどうすればよいですか?

球のようにサーフェス上の関数値をどのように視覚化できますか?

理想的には、関数の値を色にマップし、それに応じて球に色付けします。

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

%matplotlib inline 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.set_aspect("equal") 

u = np.linspace(0, 2 * np.pi, 250) 
v = np.linspace(0, np.pi, 250) 

x = np.outer(np.cos(u), np.sin(v)) 
y = np.outer(np.sin(u), np.sin(v)) 
z = np.outer(np.ones(np.size(u)), np.cos(v)) 
ax.plot_surface(x, y, z, color="w") 

私はいくつかの機能F(x,y,z)

+0

あなたがのために行くされているvisualiztionの例を持っていますか? – reptilicus

+0

@reptilicus https://www.mathworks.com/help/examples/symbolic/PlotParametricFunctionExample_01.png –

+2

matplotlibでこの例を見てきましたか?http://matplotlib.org/examples/mplot3d/surface3d_demo.html –

答えて

1

matplotlibの表面に各ポリゴンの色を設定するplot_surfacefacecolor引数を使用することを可能にします。引数は入力配列と同じ形状でなければならず、有効な色で構成する必要があります。これらの色を取得する方法はカラーマップです。

詳しくは、this questionを参照してください。

以下は、動作するコードの例です。

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


u = np.linspace(0, 2 * np.pi, 180) 
v = np.linspace(0, np.pi, 90) 

x = np.outer(np.cos(u), np.sin(v)) 
y = np.outer(np.sin(u), np.sin(v)) 
z = np.outer(np.ones(np.size(u)), np.cos(v)) 

F = np.sin(x)*y + z 
F = (F-F.min())/(F-F.min()).max() 
#Set colours and render 
fig = plt.figure(figsize=(8, 8)) 
fig.subplots_adjust(top=1, bottom=0, left=0, right=1) 
ax = fig.add_subplot(111, projection='3d') 
#use facecolors argument, provide array of same shape as z 
# cm.<cmapname>() allows to get rgba color from array. 
# array must be normalized between 0 and 1 
ax.plot_surface(
    x,y,z, rstride=1, cstride=1, facecolors=cm.jet(F), alpha=0.9, linewidth=0.9) 
ax.set_xlim([-1,1]) 
ax.set_ylim([-1,1]) 
ax.set_zlim([-1,1]) 
ax.set_aspect("equal") 

plt.savefig(__file__+".png") 
plt.show() 

enter image description here

1

surface_plotリストオプションfacecolorsためのマニュアルに従って、それを着色する私のコードを編集することができます方法:

はここで球を生成するために私のコードです。 2つの色を交互に表示する例がありますが、RGB値を含むmatplotlibの色や配列を渡すことができます。

x、y、zからF(x、y、z)までを「カラー」にマッピングし、FをRGB値に変換する必要があります。

facecolors = plt.cm.Red(F(x,y,z)) 

があります。

参照:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-plots

関連する問題