2014-09-19 43 views
2

我有一個軟件必須處理大量不同的數據,並且可能需要不同的時間來處理它。隨着軟件被修改,需要處理數據變化的時間,所以我想創建一個能夠顯示時間差異以及異常值的圖表,因爲理想情況下,這個程序的每個片段所花費的時間大致相同的數據(這聽起來很奇怪和不切實際,我知道,但只是在這裏跟我一起滾動)。首先,我想到了使用箱型圖,但我認爲它們不夠充分,因爲完全有可能一半數據集圍繞一個值盤旋,另一半圍繞另一個盤旋,而我沒有感覺一個盒子情節會說明這一點。所以我決定嘗試使用直方圖,但我無法弄清楚如何讓matplotlib以我想要的方式繪製它。我想單個圖中,X軸被標記有軟件的版本中,Y軸表示以處理的數據組所花費的時間,與多個直方圖,這樣樣機我提出:與matplotlib多個並排直方圖?

enter image description here

該曲線圖會顯示在版本0.1中,大多數數據集在2-4秒內被處理,由於某些原因,大量數據集需要12秒。 v0.1a擺脫了那些漫長的離羣值,但所有事情都花了更長的時間。 0.1b比0.1a略快。最後,0.2顯示速度提高很多,但又引入了異常值。

我該如何讓matplotlib創建一個這樣的情節?

+0

您可能會對小提琴情節感興趣。我認爲最新的matplotlib具有小提琴功能,就像在matplotlib上建立的seaborn庫一樣。 – BrenBarn 2014-09-19 21:37:57

+0

1.4確實有內置的小提琴劇情。 – tacaswell 2014-09-20 21:33:02

回答

4

下面是一個如何可以做到這一點(非常)基本樣機:

import matplotlib.pyplot as plt 
import numpy as np 

number_of_bins = 20 
number_of_data_points = 1000 

ax = plt.subplot(111) 

data_set = [np.random.normal(0, 1, number_of_data_points), 
      np.random.normal(6, 1, number_of_data_points), 
      np.random.normal(-3, 1, number_of_data_points)] 

MID_VALUES = [0, 200, 400] 
labels = ["v1", "v2", "v3"] 


for MID_VAL, y in zip(MID_VALUES, data_set): 

    hist, bin_edges = np.histogram(y, bins=number_of_bins) 

    bottom = bin_edges[:-1] 
    heights = np.diff(bin_edges) 
    lefts = MID_VAL - .5 * hist 

    ax.barh(bottom, hist, height=heights, left=lefts) 

ax.set_xticks(MID_VALUES) 
ax.set_xticklabels(labels) 

plt.show() 

enter image description here

這缺少了很多細化的我承認,比如:MID_VALUES都是手工挑選,這將取決於數據集並且可以自動化。儘管如此,你也許可以把它變成更有用的格式。

+0

這是足夠酷的尋找足夠簡單的代碼,你可以把公關放在mpl的例子嗎? – tacaswell 2014-09-20 21:35:16

+0

它在一個版本中很少(少於10個)樣本的集合上表現得有點不可思議,但正如你所說,它缺乏細化。我確信我可以通過一些工作來解決它。謝謝您的幫助! – Sohcahtoa82 2014-09-22 17:10:17

+1

我已經創建了一個PR [這裏](https://github.com/matplotlib/matplotlib/pull/3558)。一旦接受,我會更新這個答案,因爲有一些改進。特別是:這裏的'bin_edges'不完全相同,所以這段代碼出錯了。這可能會導致「無知」。我會盡快解決的,對不起。 – Greg 2014-09-23 12:06:28