我是新來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()
這仍然是一種代碼轉儲 - 將問題組織成步驟很好,因此每次都要處理每個步驟,並詢問有關失敗問題的具體問題。 – cphlewis 2015-04-01 17:26:47
對以前的粗製代碼表示歉意,並感謝您的鼓勵:現在編輯了我的代碼並更新了我的查詢。 – Dave 2015-04-02 18:12:51
修剪掉所有不再適用的文字!另外,如果你需要命令,我不明白爲什麼你需要一個字典 - 你可以創建一個元組列表並遍歷它:'for label,d in [('A'),[... ]),( 'B',[...])]'。 – cphlewis 2015-04-02 18:26:07