2012-12-05 64 views
2

我有一個包含大量(加權)方向的數據集。我想做一個很好的表示來測試/可視化在某些方向上是否有方向集羣。python/scipy中3D方向的直方圖

首先我做了三個二維極座標圖:我扔了一個維度並繪製了一個「windrose」圖,顯示了在剩餘的兩個維度中方向指向哪個方向。這似乎很好地工作:在這些表面中的兩個中存在一個或兩個方向的集羣。然而,數據是3D的,我想看看在所有這三個維度中,哪些方向的集羣都指向哪個方向。

但在3D中,問題變得更加困難。我的第一個猜測是製作一個「二維」極座標圖,結合兩個表面(傾角和方位角)的兩個角度並將其顯示爲圖像。然而,現在一些箱子在取向範圍上表現出比其他箱子更大的表面面積(我認爲這被稱爲極性奇點)。

我在Matlab中發現了這個關於這個問題的老版本:http://www.mathworks.nl/matlabcentral/newsreader/view_thread/236925,但是這裏沒有一個簡單的解決方案:首先,我寧願不使用matlab,但是Python/Scipy,其次,我不會沒有這個工具箱的許可證,第三,我有我知道這是什麼的代碼。

任何人有任何想法的替代解決方案和/或在Python/Num-/Scipy做到這一點? 有沒有一種很好的方法來在類似大小的垃圾箱上放置二維網格?

回答

0

這不是一個解決方案,「將二維網格放置在一個類似大小的容器的球體上」,因爲我不太清楚你的意思,但我認爲可能很好地形象化你的數據。

如果你可以把你的定位數據(列表中的三維矢量)和規範它那麼這可能做的工作:

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() 

所有你需要的是計算彩色地圖是一個數組reprensenting加權在圖的每個細分中存在的取向密度並將其作爲顏色kwarg傳遞。 (我會在明天看看,但這應該讓你開始)