假设我有一些函数,它将3个坐标(x,y,z)
映射到某个实数。
如何在像球体这样的表面上可视化函数值?
理想情况下,我会将函数的值映射到颜色,然后相应地为球体着色。
以下是我生成球体的代码:
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 :(得分:1)
surface_plot
的文档列出了选项facecolors
。有一个示例在两种颜色之间交替,但您可以传递任何matplotlib颜色,包括RGB值数组。
您需要自己从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
答案 1 :(得分:1)
Matplotlib允许使用facecolor
参数plot_surface
来设置曲面中每个多边形的颜色。参数需要与输入数组具有相同的形状,并且必须包含有效颜色。获取这些颜色的方法是色彩映射。
另请参阅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()