Jes*_*sse 5 python plot physics matplotlib
首先,我试图在matplotlib中绘制球谐函数,因为它们在mayavi中可以看到:http://docs.enthought.com/mayavi/mayavi/auto/example_spherical_harmonics.html
这是我在的地方:
import matplotlib.pyplot as plt
from matplotlib import cm, colors
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from scipy import special
# Create a sphere
r = 3
pi = np.pi
cos = np.cos
sin = np.sin
phi, theta = np.mgrid[0:pi:50j, 0:2*pi:50j]
x = r * sin(phi) * cos(theta)
y = r * sin(phi) * sin(theta)
z = r * cos(phi)
colorfunction=special.sph_harm(3,4,theta,phi).real
norm=colors.Normalize(vmin = np.min(colorfunction), vmax = np.max(colorfunction), clip = False)
print colorfunction
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
ax.plot_surface(
x, y, z, rstride=1, cstride=1, norm=norm, cmap=cm.jet, facecolors=cm.jet(colorfunction))
plt.show()
Run Code Online (Sandbox Code Playgroud)
该想法是用于colorfunction
根据球谐函数对球体表面着色.但是,此函数的输出是带负数的数组.我需要做的是'规范化'这个数组,以便它与matplotlib的色彩映射表现得很好.然而,与此处的答案不同,使用表面渐变的颜色matplotlib plot_surface命令,其中答案通过除以最大元素简单地预先形成一个草率标准化,我有负面元素,这样就不起作用了.我理想情况下喜欢使用matplotlib.colors.Normalize
它,但它不适用于脸谱.
我知道规范适用于cmap=cm.jet
,因为如果我facecolors
完全删除参数,我得到一个根据我的norm
函数行为的新色图.
这是我的问题的症结所在,我无法将我的规范化色彩图应用于我的脸部颜色.有任何想法吗?
这是上面代码当前生成的图.正如您所看到的那样,负值完全被截断并且信息丢失,因为色彩映射范围远大于实际值(所以一切看起来都是蓝色).
也许这太微不足道了,但是:
ax.plot_surface(x, y, z, rstride=1, cstride=1, facecolors=cm.jet(norm(colorfunction)))
Run Code Online (Sandbox Code Playgroud)
这标准化了colorfunction
.此外,通过以下方式定义规范化函数就足够了:
norm = colors.Normalize()
Run Code Online (Sandbox Code Playgroud)
这将自动缩放0..1之间的输入.
结果:
似乎cmap
和norm
关键字适用于使用Z数据为表面着色的情况,因此它们在这里没用.