规范Matplotlib中Facecolors使用的Colormap

时间:2014-07-29 19:05:53

标签: python matplotlib plot physics

首先,我试图在maypi中看到matplotlib中的球谐函数: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()

我们的想法是根据球谐度使用colorfunction为球体表面着色。但是,此函数的输出是带负数的数组。我需要做的是'规范化'这个数组所以它与matplotlib的色彩映射表现得很好。然而,与这里的答案不同,Color matplotlib plot_surface command with surface gradient,答案只是通过除以最大元素来预​​先形成一个草率的标准化,我有负面元素,所以只是不会起作用。我理想情况下喜欢使用matplotlib.colors.Normalize,但它并不适用于脸谱。

我知道规范适用于cmap=cm.jet,因为如果我完全删除facecolors参数,我会得到一个新的颜色映射,其行为符合我的norm函数。

这是我的问题的关键,我无法将我的规范化色彩图应用于我的脸部颜色。有什么想法吗?

这是上面代码当前生成的图。正如您所看到的那样,负值完全被截断并且信息丢失,因为色彩图范围远大于实际值(所以一切看起来都是蓝色)。

1 个答案:

答案 0 :(得分:7)

也许这太微不足道了,但是:

ax.plot_surface(x, y, z,  rstride=1, cstride=1, facecolors=cm.jet(norm(colorfunction)))

这会使colorfunction标准化。此外,通过以下方式定义规范化函数就足够了:

norm = colors.Normalize()

这将自动缩放0..1。

之间的输入

结果:

enter image description here

似乎cmapnorm关键字适用于使用Z数据为表面着色的情况,因此它们在此处没用。