Matplotlib彩色球体

时间:2016-09-15 21:21:00

标签: python matplotlib

我有一个数据集,它将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.我也查看了源代码,看起来似乎 向我表明脸部颜色格式不正确,但我是 努力弄清楚,究竟需要什么样的格式化。

实现这一目标的任何帮助或其他方式都将是非常重要的 赞赏。

问候

1 个答案:

答案 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会产生以下结果: enter image description here