我有一大组矢量,我想通过观察极角θ和phi来分析这些方向。所以我从这些角度的2D数组开始。
我希望通过绘制直方图或者优先将核心密度绘制到球体上(或者2D投影,因为我只需要显示半个球体)来将其可视化。
如果我使用直角图的极角,那将是完全错误的,因为 - 举个例子 - 点θ= 1°,phi = 0°& 180°比θ= 30°更近,phi = 0°& 180°。分箱失败。
如果我使用投影的2D笛卡尔坐标作为直方图,我遇到了同样的问题:x = 0,y = 0&的点。 0.1比x = 0更接近,y = 0.5& 0.6。
现在我正在使用3D笛卡尔坐标的核密度估计:
from scipy import stats
X, Y, Z = [], [], []
for i in range(300):
for j in range(500):
X.append(np.sin(i / 300 * pi / 2) * np.cos(j / 500 * 2 * pi))
Y.append(np.sin(i / 300 * pi / 2) * np.sin(j / 500 * 2 * pi))
Z.append(np.cos(i / 300 * pi / 2))
X, Y, Z = np.array(X), np.array(Y), np.array(Z)
positions = np.vstack([X, Y, Z])
# x, y and z for my data: sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta)
values = np.vstack([np.sin(data[:, 1]) * np.cos(data[:, 2]), np.sin(data[:, 1]) * np.sin(data[:, 2]), np.cos(data[:, 1])])
fig, ax = subplots(1, figsize=(7, 7))
kernel = stats.gaussian_kde(values)
density = kernel(positions)
ax.tricontourf(X, Y, density, levels=np.linspace(0, max(density), 50))
plt.box('off')
ax.set_ylim((-1.01, 1.01))
ax.set_xlim((-1.01, 1.01))
这给了我: Polar density plot
我不知道a)这是否给出了正确的结果; b)如果没有更好的解决方案。