简体   繁体   English

颜色 matplotlib plot_surface 命令与表面渐变

[英]Color matplotlib plot_surface command with surface gradient

I would like to convert surf command from MATLAB to plot_surface command in matplotlib .我想将 surf 命令从MATLAB转换为 matplotlib 中的plot_surface命令。

The challenge I am facing is when using cmap function in plot_surface command to color the surface with gradient.我面临的挑战是在 plot_surface 命令中使用cmap function 为曲面着色时使用渐变。

Here is the matlab script这是matlab脚本

% 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))

The figure from such a command can be found here.可以在此处找到此类命令的图形。 (http://www.mathworks.com/help/techdoc/visualize/f0-18164.html#f0-46458) (http://www.mathworks.com/help/techdoc/visualize/f0-18164.html#f0-46458)

Here is the python scipt When using python and matplotlib to create a similar function I am unable to color the surface with a gradient.这是python scipt 当使用 python 和 matplotlib 创建类似的 ZC1C425268E68385D1AB5074C7 表面时无法着色。

# 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()

I get the following error message:我收到以下错误消息:

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'

Any inputs would be helpful.任何输入都会有所帮助。

Praboo普拉布

First, it looks like you want the colors mapped from gradient magnitude.首先,看起来您希望从梯度幅度映射 colors。 You are trying to use the gradient vectors which is why you are getting the 'list' error.您正在尝试使用梯度向量,这就是您收到“列表”错误的原因。

Second, you can supply a cmap, but it only defines how you want the Z values mapped to a color.其次,您可以提供一个 cmap,但它只定义了您希望 Z 值如何映射到颜色。 If you want new face colors then use the facecolors argument .如果你想要新面孔 colors 然后使用facecolors参数

Third, you'll want to normalize the values to 0..1 then map them thru a colormap.第三,您需要将值标准化为 0..1,然后通过颜色图将它们标准化为 map。 (I think there is another way, but dividing the magnitude by the max is pretty simple) (我认为还有另一种方法,但是将幅度除以最大值非常简单)

Here's the code:这是代码:

# 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()

And the result:结果:

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM