我有一个数据集,它将phi和theta的元组映射到 表示信号强度的值。 我想在球体上绘制这些。我只是跟着 来自matplotlib的演示并将代码调整为我的 用例。
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超出了0的轴大小为4.我也查看了源代码,看起来似乎 向我表明脸部颜色格式不正确,但我是 努力弄清楚,究竟需要什么样的格式化。
实现这一目标的任何帮助或其他方式都将是非常重要的 赞赏。
问候
答案 0 :(得分:2)
如果您的问题是:“如何摆脱这个IndexError?”,我修改了您的代码,现在它可以工作了。 plot_surface
将X,Y,Z和面部颜色作为2D网格上相应值的2D数组。在你的情况下面部彩色不是,这是你的错误的来源。
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()
结果是球体的image。
但是,如果您的数据不在2D网格上,则您遇到了麻烦。此外,如果您的网格不规则,您绘制的球体看起来也会不规则。因此,如果您的问题是:“如何在球体上绘制热图?”,那么已经存在这样的问题,使用Basemap
包的解决方案here会产生以下结果: