2013-07-12 94 views
2

我正在研究異常值檢測。布倫丹格雷格有一個非常好的article,我特別感興趣的是他的可視化。他使用的方法之一是frequency trailsmatplotlib中的頻率線索

frequency trails

我試圖用this例如重現這matplotlib。它看起來像這樣:

polys3d_demo

,情節是基於這樣的回答:https://stackoverflow.com/a/4152016/948369

現在我的問題是,像布倫丹描述,我有一個連續的線掩蓋離羣值(我簡化了輸入值,所以你仍然可以看到他們):

masked outlier

上拍行「非連續」爲不存在的值任何幫助嗎?

回答

4

我會堅持一個平坦的二維圖,並將每個水平位移一個設定的垂直量。您必須播放關卡(在下面的代碼中我稱之爲displace)才能正確看到異常值,但這在複製目標圖像方面做得相當不錯。我認爲關鍵是將「零」值設置爲None,所以pylab不繪製它們。

enter image description here

import numpy as np 
import pylab as plt 
import itertools 

k = 20 
X = np.linspace(0, 20, 500) 
Y = np.zeros((k,X.size)) 

# Add some fake data 
MU = np.random.random(k) 
for n in xrange(k): 
    Y[n] += np.exp(-(X-MU[n]*n)**2/(1+n/3)) 
Y *= 50 

# Add some outliers for show 
Y += 2*np.random.random(Y.shape) 

displace = Y.max()/4 

# Add a cutoff 
Y[Y<1.0] = None 

face_colors = itertools.cycle(["#D3D820", "#C9CC54", 
           "#D7DA66", "#FDFE42"]) 

fig = plt.figure() 
ax = fig.add_subplot(111, axisbg='black') 
ax.xaxis.set_visible(False) 
ax.yaxis.set_visible(False) 

for n,y in enumerate(Y): 
    # Vertically displace each plot 
    y0 = np.ones(y.shape) * n * displace 
    y1 = y + n*displace 

    plt.fill_between(X, y0,y1,lw=1, 
        facecolor=face_colors.next(), 
        zorder=len(Y)-n) 
plt.show() 
+0

這看起來非常簡潔,過會兒我給它一個鏡頭,給你的反饋如何去。 – Glaslos