我有一个数据集,它将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的格式不正确,但我很难弄清楚,到底需要什么格式。
1条答案
按热度按时间wecizke31#
如果你的问题是:“如何摆脱这个IndexError?“,我修改了你的代码,现在它工作了。
plot_surface
将X、Y、Z和面部颜色作为二维网格上对应值的二维数组。在你的情况下,面部颜色不是,这是你错误的根源。但是,如果您的数据不在2D网格上,您就有麻烦了。此外,如果网格不规则,则绘制的球体看起来也不规则。如果你的问题是:“* 如何在球体上绘制热图?*",已经有这样的问题和解决方案here使用
Basemap
包产生这样的结果: