2015-04-01 61 views
0

我是新來Matplotlib/Python和我試圖做一個組合箱線圖非常相似,喬金頓的很好的例子如下所示:Matplotlib:利用numpy的陣列和組/亞組列表中的數據分組的箱圖標籤

how to make a grouped boxplot graph in matplotlib

我想修改喬的例子以滿足我自己的需求。

對於我下面的演示數據,我有5個人,每個人在3個不同的任務中都有4次嘗試(=「企圖」:'1st','2nd','3rd','4th')任務「:'A','B','C')。

我想能夠:

1)輸入我的一系列2D numpy的陣列的數據,如圖每個任務一個陣列,其每一個嵌套在所述5個個體的分數構成的4次連續嘗試。

2)使用字符串標記圖的共享x軸上的任務和嘗試,並將其作爲順序項分別保存在列表「tasklist」和「trylist」中。

3)推廣解決方案,爲任何數量的個人和任何數量的任務做出適當的繪圖,每個任務都需要任何次數的重複嘗試。

編輯: 2015年4月2日:

優秀的唯一問題是看似反直覺的方式,Python列表使用.keys()方法時自我組裝成一個非順序的次序;因此我的任務列表不斷以「A,C,B」出現,而不是「A,B,C」。 解決方法是導入並創建有序字典。這對我來說是全新的,但這似乎要求我的任務列表中的項目名稱被聲明兩次,如Joe在他的示例中所做的那樣 - 一次將任務與相應的數據矩陣相關聯,一次將項目名稱關聯到有序字典與相應的連續數字鍵...

想知道:是否有一種方法(類似於常規字典的.keys()方法),它將迭代我的數據矩陣,以順序創建一個有序字典顯示(「A,B,C」),而不需要我輸入兩次任務列表的詳細信息?

非常感謝

戴夫

import matplotlib.pyplot as plt 
import numpy as np 

data = {} 
data ['A'] = np.array([[1,2,3,4,9],[2,3,4,4,4],[3,4,4,5,5],[5,6,6,7,7,7]]) 
data ['B'] = np.array([[2,3,4,4,5],[3,4,5,6,10],[4,5,6,6,7],[5,6,7,7,8]]) 
data ['C'] = np.array([[4,5,6,6,10],[6,7,8,8,8],[7,8,9,9,10],[2,10,11,11,12]]) 

tasklist = data.keys() # list of labels for tasks 'A' to 'C' (each containing 4 attempts labelled '1st' to '4th') 
attemptlist = ['1st','2nd','3rd','4th'] # list of labels for attempts 1 to 4 within each task 

fig, axes = plt.subplots(ncols= len(tasklist), sharey=True) 
fig.subplots_adjust(wspace=0) 

for ax,task in zip(axes,tasklist): 
    ax.boxplot([data[task][attemptlist.index(attempt)] for attempt in attemptlist],showfliers=False) 
    ax.set(xticklabels=attemptlist, xlabel=task) 
plt.show() 
+1

這仍然是一種代碼轉儲 - 將問題組織成步驟很好,因此每次都要處理每個步驟,並詢問有關失敗問題的具體問題。 – cphlewis 2015-04-01 17:26:47

+0

對以前的粗製代碼表示歉意,並感謝您的鼓勵:現在編輯了我的代碼並更新了我的查詢。 – Dave 2015-04-02 18:12:51

+0

修剪掉所有不再適用的文字!另外,如果你需要命令,我不明白爲什麼你需要一個字典 - 你可以創建一個元組列表並遍歷它:'for label,d in [('A'),[... ]),( 'B',[...])]'。 – cphlewis 2015-04-02 18:26:07

回答

1

@cphlewis:非常感謝:您的建議已重新編寫的代碼格式化爲元組(任務數據)的列表數據,現在擁有控制權繪製任務的順序。

MWE下面張貼的情況下,這有助於其他人。

import matplotlib.pyplot as plt 

data = [[('A'),[[1,2,3,4,9],[2,3,4,4,4],[3,4,4,5,5],[5,6,6,7,7,7]]], 
    [('B'),[[2,3,4,4,5],[3,4,5,6,10],[4,5,6,6,7],[5,6,7,7,8]]], 
    [('C'),[[4,5,6,6,10],[6,7,8,8,8],[7,8,9,9,10],[2,10,11,11,12]]] 
    ] 
attemptlist = ['1st','2nd','3rd','4th'] 
fig, axes = plt.subplots(ncols= len(data), sharey=True) 
fig.subplots_adjust(wspace=0) 

for ax,d in zip(axes,data):  
    ax.boxplot([d[1][attemptlist.index(attempt)] for attempt in attemptlist],showfliers=False) 
    ax.set(xticklabels=attemptlist, xlabel=d[0]) 
plt.show()