2016-12-19 5 views
1

Angenommen, ich habe eine Funktion, die 3 Koordinaten (x,y,z) auf eine reelle Zahl abbildet.Wie kann ich einen Funktionswert in 3D visualisieren?

Wie kann ich die Funktionswerte auf einer Oberfläche wie eine Kugel visualisieren?

Im Idealfall würde ich den Wert der Funktion einer Farbe zuordnen und dann die Kugel entsprechend färben.

Hier ist mein Code eine Kugel zu erzeugen:

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") 

Wie kann ich meinen Code bearbeiten für surface_plot listet die Option facecolors bis zu einem gewissen Funktion F(x,y,z)

+0

Haben Sie ein Beispiel eines visualiztion haben Sie gehen? – reptilicus

+0

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

+2

Haben Sie dieses Beispiel auf Matplotlib untersucht? Http: //matplotlib.org/examples/mplot3d/surface3d_demo.html –

Antwort

1

Matplotlib ermöglicht plot_surface das facecolor Argument zu verwenden, um die Farbe jedes Polygon in der Oberfläche einzustellen. Das Argument muss die gleiche Form wie die Eingabearrays haben und aus gültigen Farben bestehen. Eine Möglichkeit, diese Farben zu erhalten, ist eine Colormap.

Siehe auch this question für Details.

Unten ist ein funktionierender Beispielcode.

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

Die Dokumentation nach Farbe. Es gibt ein Beispiel, das zwischen zwei Farben wechselt, aber Sie können jede Matplotlib-Farbe übergeben, einschließlich RGB-Werte.

Sie müssen die Abbildung selbst von x, y, z zu F (x, y, z) zu "color" machen und dann F in einen RGB-Wert umwandeln.

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

sollte tun.

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

Verwandte Themen