2

我有一个包含大量(加权)方向的数据集。我想做出一个很好的表示来测试/可视化在某些方向上是否存在方向簇。

首先,我制作了三个 2D 极坐标图:我扔掉了一个维度并绘制了一个“风玫瑰图”,显示了在其余两个维度中方向指向的方向。这似乎工作得很好:在其中两个表面中有一个或两个方向簇。然而,数据是 3D 的,我想看看方向集群在所有这三个维度中指向的位置。

然而,在 3D 中,问题变得更加困难。我的第一个猜测是制作一个“二维”极坐标图,将两个表面中的两个角度(倾角和方位角)结合起来,并将其显示为图像。然而,现在,一些 bin 在方向球上代表了比其他 bin 更大的表面区域(我认为这被称为极点奇点)。

我在 Matlab 中找到了这个关于这个问题的旧线程:http: //www.mathworks.nl/matlabcentral/newsreader/view_thread/236925,但那里并没​​有真正简单的解决方案:首先我宁愿不工作使用 matlab,但使用 Python/Scipy,其次,我没有此工具箱的许可证,第三,我宁愿拥有我知道的代码。

任何人对替代解决方案和/或在 Python/Num-/Scipy 中执行此操作的方法有任何想法吗?有没有一种很好的方法可以在类似大小的容器球体上放置 2D 网格?

4

1 回答 1

0

这不是“将 2Dgrid 放置在类似大小的容器的球体上”的解决方案,因为我不太确定您的意思是什么,但我认为可视化您的数据可能会很好。

如果您可以获取方向数据(3D 向量列表)并将其标准化,那么这可能会起作用:

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

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

orientation = np.random.random((3,50))
weight = np.random.randint(100, size=50)

ax.scatter(orientation[0], orientation[1], zs= orientation[2], s=weight)
plt.show()

它将绘制表示归一化方向向量和与每个方向相关的权重大小的点。

或者更复杂但更符合您最初的想法,matplotlib 3D 绘图教程中的这个片段:

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

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

u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

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=4, cstride=4, color='b')

plt.show()

您只需要计算一个颜色图,它是一个数组,表示图的每个细分中存在的方向的加权密度,并将其作为颜色 kwarg 传递。(我明天会调查,但这应该让你开始)

于 2012-12-06T03:17:10.013 回答