Python matplotlib中的距离相关着色

Python matplotlib中的距离相关着色,python,matplotlib,Python,Matplotlib,我想画一些电磁散射过程的远场图 为此,我计算了θ、φ和r。坐标θ和φ在unitsphere上创建了一个规则的网格,因此我可以使用plot_Surface()转换为笛卡尔坐标 我现在的问题是,我需要一种方法来根据半径r而不是高度z为曲面着色,这似乎是默认值 有没有办法改变这种依赖关系?我不知道你进展如何,所以也许你已经解决了。但是,根据保罗评论中的链接,你可以这样做。我们使用plot_surface的facecolor参数传递所需的颜色值 (我已经修改了matplotlib文档中的surface3

我想画一些电磁散射过程的远场图

为此,我计算了θ、φ和r。坐标θ和φ在unitsphere上创建了一个规则的网格,因此我可以使用
plot_Surface
()转换为笛卡尔坐标

我现在的问题是,我需要一种方法来根据半径r而不是高度z为曲面着色,这似乎是默认值


有没有办法改变这种依赖关系?

我不知道你进展如何,所以也许你已经解决了。但是,根据保罗评论中的链接,你可以这样做。我们使用plot_surface的facecolor参数传递所需的颜色值

(我已经修改了matplotlib文档中的surface3d演示)

编辑:正如Stefan在评论中指出的,我的答案可以简化为:

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

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
xlen = len(X)
Y = np.arange(-5, 5, 0.25)
ylen = len(Y)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
maxR = np.amax(R)
Z = np.sin(R)

# Note that the R values must still be normalized.
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=cm.jet(R/maxR),
        linewidth=0)

plt.show()
和(结束)我不必要的复杂原始版本,使用与上面相同的代码,尽管省略了matplotlib.cm导入

# We will store (R, G, B, alpha)
colorshape = R.shape + (4,)
colors = np.empty( colorshape )
for y in range(ylen):
    for x in range(xlen):
        # Normalize the radial value.
        # 'jet' could be any of the built-in colormaps (or your own).
        colors[x, y] = plt.cm.jet(R[x, y] / maxR )

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,
        linewidth=0)

plt.show()

我不知道你进展如何,所以也许你已经解决了。但是,根据保罗评论中的链接,你可以这样做。我们使用plot_surface的facecolor参数传递所需的颜色值

(我已经修改了matplotlib文档中的surface3d演示)

编辑:正如Stefan在评论中指出的,我的答案可以简化为:

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

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
xlen = len(X)
Y = np.arange(-5, 5, 0.25)
ylen = len(Y)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
maxR = np.amax(R)
Z = np.sin(R)

# Note that the R values must still be normalized.
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=cm.jet(R/maxR),
        linewidth=0)

plt.show()
和(结束)我不必要的复杂原始版本,使用与上面相同的代码,尽管省略了matplotlib.cm导入

# We will store (R, G, B, alpha)
colorshape = R.shape + (4,)
colors = np.empty( colorshape )
for y in range(ylen):
    for x in range(xlen):
        # Normalize the radial value.
        # 'jet' could be any of the built-in colormaps (or your own).
        colors[x, y] = plt.cm.jet(R[x, y] / maxR )

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,
        linewidth=0)

plt.show()

也许这有帮助:我没有注意到这种可能性。我试图实现这一点。谢谢还可以从Enthound查看
mayavi
。这是一个不同的框架,但它是围绕openGL构建的,所以在3D渲染方面做得更好。也许这有帮助:我没有注意到这种可能性。我试图实现这一点。谢谢还可以从Enthound查看
mayavi
。这是一个不同的框架,但它是围绕openGL构建的,所以在3D渲染方面做得更好。谢谢!我基本上就是这么做的。但是我直接通过
facecolors=cm.jet(rdata)
plot\u surface
中使用半径。啊,是的,当然!干净多了。我会在我的回答中记下这一点,以供其他偶然发现它的人参考。@Sam我发现您的解决方案非常有用,谢谢您--您知道如何将颜色映射扩展到(X,Y,Z)依赖关系吗?我试图扩展您的解决方案,但遇到了问题。您应该能够扩展上述内容,例如
Z=np.arange(-5,5,0.25)
zlen=len(Z)
X,Y,Z=np.meshgrid(X,Y,Z)
R=np.sqrt(X**2+Y**2+Z**2)
。然后为范围(zlen)中的z添加第三个嵌套for循环
:colors[x,y,z]=plt.cm.jet(R[x,y,z]/maxR)
。但是如果这不起作用,或者不是你想要的,可能最好问一个新问题。谢谢!我基本上就是这么做的。但是我直接通过
facecolors=cm.jet(rdata)
plot\u surface
中使用半径。啊,是的,当然!干净多了。我会在我的回答中记下这一点,以供其他偶然发现它的人参考。@Sam我发现您的解决方案非常有用,谢谢您--您知道如何将颜色映射扩展到(X,Y,Z)依赖关系吗?我试图扩展您的解决方案,但遇到了问题。您应该能够扩展上述内容,例如
Z=np.arange(-5,5,0.25)
zlen=len(Z)
X,Y,Z=np.meshgrid(X,Y,Z)
R=np.sqrt(X**2+Y**2+Z**2)
。然后为范围(zlen)中的z添加第三个嵌套for循环
:colors[x,y,z]=plt.cm.jet(R[x,y,z]/maxR)
。但如果这不起作用,或者不是你想要的,可能最好问一个新问题。