Python中3D表面图的颜色

dif*_*teD 6 python plot matplotlib

我正在使用以下行来绘制3D曲面:

surf = ax3.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5, linewidth=0, cmap=cm.jet,antialiased=True)
Run Code Online (Sandbox Code Playgroud)

现在,颜色变得非常漂亮,虽然外观有点鳞片,但是很好。
但是我想更改其他数据的表面颜色,存储list为:

m = [104.48, 111.73,109.93,139.95,95.05,150.49,136.96,157.75]
Run Code Online (Sandbox Code Playgroud)

我正在尝试:

norm = cls.Normalize() # Norm to map the 'm' values to [0,1]
norm.autoscale(m)
cmap = cm.ScalarMappable(norm, 'jet')
surf = ax3.plot_surface(X, Y, Z, rstride=5, cstride=5, alpha=0.5, linewidth=0, color=cmap.to_rgba(m), antialiased=True)
Run Code Online (Sandbox Code Playgroud)

但这引起了错误,因为cmap.to_rgba仅采用一维阵列。我对如何改变colormap表面的任何建议将不胜感激。

pin*_*gul 7

要获得正确的颜色,请使用 Z 值从颜色图中选取值:

my_col = cm.jet(Z/np.amax(Z))
Run Code Online (Sandbox Code Playgroud)

结果:

曲面图

否则使用与@Moritz 相同的代码。

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
my_col = cm.jet(Z/np.amax(Z))

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors = my_col,
        linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)

plt.show()
Run Code Online (Sandbox Code Playgroud)


Mor*_*itz 5

好吧,它看起来很糟糕,但我认为您可以适应它:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
my_col = cm.jet(np.random.rand(Z.shape[0],Z.shape[1]))

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors = my_col,
        linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
Run Code Online (Sandbox Code Playgroud)

我不会使用jet,而是使用一些线性颜色图cubehelix。您可以使用错误的颜色图轻松欺骗眼睛(该主题上的许多帖子之一

  • @ diffracteD,m与X,Y和Z有什么关系?例如,它具有相同数量的元素吗?您想如何将m映射到您的表面上? (2认同)