python中三维曲面打印的颜色

python中三维曲面打印的颜色,python,matplotlib,plot,Python,Matplotlib,Plot,我正在使用以下线条绘制三维曲面: surf = ax3.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5, linewidth=0, cmap=cm.jet,antialiased=True) 现在颜色非常漂亮,虽然外观有点鳞片,但很好。 但我想更改表面颜色w.r.t.另一个数据,存储在列表中为: m = [104.48, 111.73,109.93,139.95,95.05,150.49,136.96,157.75] 我试着: no

我正在使用以下线条绘制三维曲面:

surf = ax3.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5, linewidth=0, cmap=cm.jet,antialiased=True)
现在颜色非常漂亮,虽然外观有点鳞片,但很好。
但我想更改表面颜色w.r.t.另一个数据,存储在
列表中
为:

m = [104.48, 111.73,109.93,139.95,95.05,150.49,136.96,157.75]
我试着:

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)
但这会引起一个错误,因为cmap.to_rgba只接受1D数组。
对于如何更改曲面的
颜色贴图
的任何建议,我们将不胜感激。

看起来很糟糕,但我认为您可以调整它:

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)

我不会使用jet,而是使用一些线性彩色贴图,如
cubehelix
。您可以很容易地使用错误的颜色贴图欺骗眼睛(关于该主题)

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

my_col = cm.jet(Z/np.amax(Z))
结果是:

使用与@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()

我使用熊猫在python中使用了一些行,情节非常精彩

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
import pandas as pd
from sys import argv

file = argv[1]

x,y,z = np.loadtxt(file, unpack=True)
df = pd.DataFrame({'x': x, 'y': y, 'z': z})

fig = plt.figure()
ax = Axes3D(fig)
surf = ax.plot_trisurf(df.x, df.y, df.z, cmap=cm.jet, linewidth=0.1)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.savefig('teste.pdf')
plt.show()


再漂亮一点!在我的例子中,我使用了彩色贴图喷射器,但是还有其他种类的彩色和定性贴图。查看之前的链接。

如果我正确获取了它,则您正在绘制
X,Y,Z
,并根据
Z-array
为曲面提供自定义颜色。但是我已经有了一个白色的表面(
X,Y,Z
),我现在要做的就是根据
m-array
的值给表面上色。如果我有误解,请纠正我。你必须在缩放的m型阵列上使用
meshgrid
,以获得2D阵列。是的,我在
x,y,z
拟合的情况下使用
np.meshgrid
,但它给了我一个矩阵数据(秩3)以传递到
plot_曲面(x,y,z,…)
,以生成曲面。现在,如何在绘图中处理矩阵秩4(如果我包括
m
)?关于你的想法的一点代码会很好。只要你不提供数组
m
和一些最小的示例,我只能猜测。@diffracteD,m与X、Y和Z的关系如何?例如,它有相同数量的元素吗?你想如何将m映射到你的曲面上?有没有办法去除绘图的鳞状外观并获得光滑的外观?你必须将数据插值到更精细的网格上。@Moritz说的正是绕射。将
np.arange(-5,5,0.25)
中的0.25更改为较低的值。@pingul我会就鳞片外观与您联系。但更重要的是,我关心的是使用m值作为XYZ曲面上的颜色贴图。请对此问题发表意见。@您需要为每个Z值指定一个颜色值,即
m
需要包含与Z相同的尺寸(检查
Z.shape
==
m.shape
)。如果是这种情况,只需将代码更改为
my_col=cm.jet(m/np.amax(m))
即可对其进行规范化。