使用matplotlib surface_plot和FaceColor的意外常量颜色

使用matplotlib surface_plot和FaceColor的意外常量颜色,matplotlib,colors,3d,surface,Matplotlib,Colors,3d,Surface,我在球面上画一个函数。为了测试我的代码,我只需绘制球坐标φ除以pi。我明白了 出乎意料的是,球体的一半具有相同的颜色,而另一半的颜色不正确(在phi=pi时,我应该得到1,而不是2)。如果我将数据数组除以2,问题就消失了。有人能给我解释一下发生了什么事吗 以下是我使用的代码: import matplotlib.pyplot as plt import numpy as np from matplotlib import cm from mpl_toolkits.mplot3d import

我在球面上画一个函数。为了测试我的代码,我只需绘制球坐标φ除以pi。我明白了

出乎意料的是,球体的一半具有相同的颜色,而另一半的颜色不正确(在phi=pi时,我应该得到1,而不是2)。如果我将数据数组除以2,问题就消失了。有人能给我解释一下发生了什么事吗

以下是我使用的代码:

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

# prepare the sphere surface
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
phi = np.linspace(0,2*np.pi, 50)
theta = np.linspace(0, np.pi, 25)
x=np.outer(np.cos(phi), np.sin(theta))
y=np.outer(np.sin(phi), np.sin(theta))
z=np.outer(np.ones(np.size(phi)), np.cos(theta))

# prepare function to plot
PHI=np.outer(phi,np.ones(np.size(theta)))
THETA=np.outer(np.ones(np.size(phi)),theta)
data = PHI/np.pi

# plot
surface=ax.plot_surface(x, y, z, cstride=1, rstride=1, 
                        facecolors=cm.jet(data),cmap=plt.get_cmap('jet'))

# add colorbar
m = cm.ScalarMappable(cmap=surface.cmap,norm=surface.norm)
m.set_array(data)
plt.colorbar(m)
plt.show()

代码中有一点混乱

  • 指定
    facecolors
    时,没有理由提供颜色映射,因为不需要从颜色映射检索facecolors
  • 颜色贴图的范围从0到1。您的数据范围从0到2。因此,一半的脸颜色是相同的。因此,首先需要将数据规格化为
    (0,1)
    -范围,例如使用
    规格化
    实例,然后可以应用颜色映射

    norm = plt.Normalize(vmin=data.min(), vmax=data.max()) 
    surface=ax.plot_surface(x, y, z, cstride=1, rstride=1, 
                            facecolors=cm.jet(norm(data)))
    
  • 对于颜色条,您应该使用与绘图本身相同的颜色映射和规格化

    m = cm.ScalarMappable(cmap=cm.jet,norm=norm)
    m.set_array(data)
    
完整代码:

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

# prepare the sphere surface
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
phi = np.linspace(0,2*np.pi, 50)
theta = np.linspace(0, np.pi, 25)
x=np.outer(np.cos(phi), np.sin(theta))
y=np.outer(np.sin(phi), np.sin(theta))
z=np.outer(np.ones(np.size(phi)), np.cos(theta))

# prepare function to plot
PHI=np.outer(phi,np.ones(np.size(theta)))
THETA=np.outer(np.ones(np.size(phi)),theta)
data = PHI/np.pi

# plot
norm = plt.Normalize(vmin=data.min(), vmax=data.max()) 
surface=ax.plot_surface(x, y, z, cstride=1, rstride=1, 
                        facecolors=cm.jet(norm(data)))

# add colorbar
m = cm.ScalarMappable(cmap=cm.jet,norm=norm)
m.set_array(data)
plt.colorbar(m)
plt.show()