2016-08-19 189 views
1

我仍在研究紐約地鐵數據。我以這樣一種方式清理和爭奪數據,即我現在每個工作站每小時(從0到23)的「平均條目數」和「平均出口數」分隔爲週末和工作日(類別變量有兩個可能的值:週末/週日)。有沒有一種很好的方式來可視化大量子圖(> 500)?

我想要做的是創建一個情節,每個工作站都是一排,每行有兩列(第一個是平日,第二個是週末)。我想繪製每小時的「平均參賽作品」和「平均出場次數」,以獲得有關電臺的一些信息。這裏有兩件有趣的事情。首先是純粹的數字來表明一個電臺有多忙;其次是給定小時的入場和出場比例,以表明該臺站是否爲居住區(早上入場負荷,晚上出口負荷)或更多的工作區域(早上出口負荷,入口大約在下午4點,6點和8點左右偷看)。唯一的問題是,大約有550個電臺。

我試圖用seaborn facetgrid繪製它,它不能處理多個站點(10個左右)而沒有遇到內存問題。

所以我想知道是否有人有一個好主意來完成我想要做的事情。

請隨附筆記本(倒數第二格表示我試圖將數據可視化,即繪製4個站點)。這顯然不適用於500多個電臺,所以可能連續5個電臺?

的最後一個單元格包含站R001的數據作爲評論請..

https://github.com/FBosler/Udacity/blob/master/Example.ipynb

任何輸入非常感謝! Fabian

+0

您能否提供一個站點數據的快速示例? – kezzos

+0

https://github.com/FBosler/Udacity/blob/master/Example.ipynb最後一個單元格用於工作站R001 –

回答

1

你可以做到的一種可能的方法是使用每個工作站的出口比例。每天/每小時可以在圖像上形成一列,每一行將成爲一個站。作爲連接例如:

from matplotlib import pyplot as plt 
import random 
import numpy as np 


all_stations = [] 

for i in range(550): 
    entries = [float(random.randint(0, 50)) for i in range(7*24)] # Data point for each hour over a week 
    exits = [float(random.randint(0, 50)) for i in range(7*24)] 

    weekend_entries = entries[:2*7] 
    weekend_exits = exits[:2*7] 

    day_entries = entries[2*7:] 
    day_exits = exits[2*7:] 

    weekend_ratio = [np.array(en)/np.array(ex) for en, ex in zip(weekend_entries, weekend_exits)] 
    day_ratio = [np.array(en)/np.array(ex) for en, ex in zip(day_entries, day_exits)] 

    whole_week = weekend_ratio + day_ratio 

    all_stations.append(whole_week) 

plt.figure() 
plt.imshow(all_stations, aspect='auto', interpolation="nearest") 
plt.xlabel("Hours") 
plt.ylabel("Station number") 
plt.title("Entry/exit ratio per station") 
plt.colorbar(label="Entry/exit ratio") 
# Add some vertical lines to indicate days 
for j in range(1, 7): 
    plt.plot([j*24]*2, [0, 550], color="black") 
plt.xlim(0, 7*24) 
plt.ylim(0, 550) 
plt.show() 

enter image description here

如果你想顯示的實際數字所涉及的不是比,我會考慮的每項內容,並出口數據的數據分成兩個,一個圖像集。然後可以使用每個像素的強度來通知數量,而不是比率。

+0

我真的很喜歡你將數據顯示爲一個站點的想法。不過我會做一些調整。 1.小時分類(範圍從0到23) 2.取代顏色,我認爲每小時都會有一個迷你條形圖會很酷。 3.將24小時類別細分爲條目並退出,以便每個小時列具有兩個子列,其中有一個紅色(分別爲綠色)條,表示平均退出(條目) 4.週末的第二個圖表。那有意義嗎? –

+0

是的,你可能可以把所有的東西都放到像數組這樣的圖像中,但是當你想要不同顏色代表不同的東西時,它會變得更加複雜。對於第1點,您可以重新標記x軸以反映您的命名類別,請參閱plt.xlabels(['cata','catb','catc'等])。對於第2點,您可以添加另一行或進一步拆分列,我可能會添加另一行,所以每個工作站有一個紅色行和一個綠色行,這將比較容易。爲了解決這個問題會有點麻煩,你需要構建自己的RGB圖像,每個像素都是自定義的 – kezzos

1

不管你做什麼,你都會在屏幕上顯示它們,除非你有一整面監視器,但是爲了避開內存限制,你可以柵格化它們並保存到圖像文件(我建議png格式的可壓縮性與幾個不同顏色的圖像)

你想要的,什麼是pyplot.savefig()

Here's一個答案,如何做到這一點的另一個問題,有一些技巧和竅門

+0

如果我只是想了解數據,這絕對是我會做的。將每個圖的繪圖保存到一個文件中,然後像瀏覽照片庫一樣瀏覽它們。 如果您想要一個令人印象深刻的演示文稿,請抓取地鐵系統的SVG地圖,並編寫一些javascript,以便在用戶點擊或懸停在電臺上時顯示每個電臺的情節。沒那麼難做。 –

+0

順便說一句,如果你從筆記本上製作這些圖,請確保禁用'%matplotlib inline',否則你將遇到創建所有圖的內存問題(這是一個已知的筆記本問題:https://github.com/ IPython中/ IPython中/問題/ 7270)。 –

+0

@VictorChubukov感謝您的反饋!你的想法顯然是一個非常熟練的程序員將採取的路線:) 它可能遠高於我的水平,但假設我想要做你的建議,我將如何去做/我必須先學什麼? –

2

而不是550+ subplots看你是否可以製作兩個大的numpy陣列,然後使用2個小插曲,一個用於工作日,一個用於週末

對於y值,首先找到平均值(0)和最大值(10,000?)值,將這些值縮放以適合每個假行(例如10px),然後將數據中的每行以10px *行號進行偏移。

由於您需要爲每個24個數據點繪製線圖,因此必須以10px爲增量在數據點之間進行線性插值,以便最終的numpy陣列爲240 x 5500 x 2.

相關問題