gpt4 book ai didi

python - 具有表面渐变的颜色 matplotlib plot_surface 命令

转载 作者:IT老高 更新时间:2023-10-28 21:15:46 25 4
gpt4 key购买 nike

我想将 MATLAB 中的 surf 命令转换为 ma​​tplotlib 中的 plot_surface 命令。

我面临的挑战是在 plot_surface 命令中使用 cmap 函数对曲面进行渐变着色。

这是 ma​​tlab 脚本

% Matlab Commands
x = -5:.25:5; y = x
[x,y] = meshgrid(x);
R = sqrt(x.^2 + y.^2);
Z = sin(R)
surf(x,y,Z,gradient(Z))

可以在此处找到此类命令的图形。 (http://www.mathworks.com/help/techdoc/visualize/f0-18164.html#f0-46458)

这里是 python scipt当使用 python 和 matplotlib 创建类似的函数时,我无法使用渐变为表面着色。

# Python-matplotlib Commands
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
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)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=gradient(Z), linewidth=0, antialiased=False)
plt.show()

我收到以下错误消息:

Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
File "C:\Python26\lib\site-packages\spyderlib\widgets\externalshell\startup.py", line 122, in runfile
execfile(filename, glbs)
File "C:\Documents and Settings\mramacha\My Documents\Python\Candela\tmp.py", line 13, in <module>
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=gradient(Z), linewidth=0, antialiased=False)
File "C:\Python26\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 729, in plot_surface
polyc = art3d.Poly3DCollection(polys, *args, **kwargs)
File "C:\Python26\lib\site-packages\mpl_toolkits\mplot3d\art3d.py", line 344, in __init__
PolyCollection.__init__(self, verts, *args, **kwargs)
File "C:\Python26\lib\site-packages\matplotlib\collections.py", line 570, in __init__
Collection.__init__(self,**kwargs)
File "C:\Python26\lib\site-packages\matplotlib\collections.py", line 86, in __init__
cm.ScalarMappable.__init__(self, norm, cmap)
File "C:\Python26\lib\site-packages\matplotlib\cm.py", line 155, in __init__
self.cmap = get_cmap(cmap)
File "C:\Python26\lib\site-packages\matplotlib\cm.py", line 126, in get_cmap
if name in cmap_d:
TypeError: unhashable type: 'list'

任何输入都会有所帮助。

普拉布

最佳答案

首先,您似乎希望从渐变幅度映射颜色。您正在尝试使用梯度向量,这就是您收到“列表”错误的原因。

其次,您可以提供一个 cmap,但它只定义了您希望 Z 值如何映射到颜色。如果您想要新的面部颜色,请使用 facecolors argument .

第三,您需要将值标准化为 0..1,然后通过颜色图映射它们。 (我认为还有另一种方法,但是将幅度除以最大值非常简单)

代码如下:

# Python-matplotlib Commands
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, .25)
Y = np.arange(-5, 5, .25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
Gx, Gy = np.gradient(Z) # gradients with respect to x and y
G = (Gx**2+Gy**2)**.5 # gradient magnitude
N = G/G.max() # normalize 0..1
surf = ax.plot_surface(
X, Y, Z, rstride=1, cstride=1,
facecolors=cm.jet(N),
linewidth=0, antialiased=False, shade=False)
plt.show()

结果:

enter image description here

关于python - 具有表面渐变的颜色 matplotlib plot_surface 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6539944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com