matplotlib 如何创建彩色球体

j2cgzkjk  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个数据集,它将phi和theta的元组Map到一个代表信号强度的值。我想把这些画在球体上。我简单地遵循matplotlib中的一个demo并根据我的用例调整代码。

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

u = phi
v = theta
vals =vals/vals.max()
Map = cm.coolwarm
facecolors = Map(vals[:])

x = 10 * np.outer(np.cos(u), np.sin(v))

y = 10 * np.outer(np.sin(u), np.sin(v))

z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))

ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False, facecolors=facecolors)

plt.show()

这将生成错误消息IndexError:索引4超出尺寸为4的轴0的边界。我还查看了源代码,这似乎向我表明facecolors的格式不正确,但我很难弄清楚,到底需要什么格式。

wecizke3

wecizke31#

如果你的问题是:“如何摆脱这个IndexError?“,我修改了你的代码,现在它工作了。plot_surface将X、Y、Z和面部颜色作为二维网格上对应值的二维数组。在你的情况下,面部颜色不是,这是你错误的根源。

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

u, v = np.mgrid[0:np.pi:50j, 0:2*np.pi:50j]

strength = u
norm=colors.Normalize(vmin = np.min(strength),
                      vmax = np.max(strength), clip = False)

x = 10 * np.sin(u) * np.cos(v)
y = 10 * np.sin(u) * np.sin(v)
z = 10 * np.cos(u)

ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False,
                       facecolors=cm.coolwarm(norm(strength)))

plt.show()

但是,如果您的数据不在2D网格上,您就有麻烦了。此外,如果网格不规则,则绘制的球体看起来也不规则。如果你的问题是:“* 如何在球体上绘制热图?*",已经有这样的问题和解决方案here使用Basemap包产生这样的结果:

相关问题