2017-02-04 44 views
0

所以我有不同的大小和包含一些相同的和不同的字/元件的兩個列表:計數元件和堆疊從每個列表的結果的條形圖中

list1 = ["red", "blue", "yellow", "yellow", "blue", "green", "pink", "red"] 
list2 = ["black", "black", "yellow", "red", "blue", "pink", "pink", "red", "purple", "white", "red", "orange", "red", "brown", "brown"] 

如果我想指望有多少的話每一個在每個列表,並結合我說:

import collections 
from collections import Counter 
import numpy as np 
import matplotlib.pyplot as plt 

list_total = list1 + list2 

c1 = Counter(list1) 
c2 = Counter(list2) 
c_all = Counter(list_total) 

輸出結果(如果打印C的)則是:

Counter({'blue': 2, 'yellow': 2, 'red': 2, 'pink': 1, 'green': 1}) 
Counter({'red': 4, 'pink': 2, 'brown': 2, 'black': 2, 'blue': 1, 'purple': 1, 'yellow': 1, 'orange': 1, 'white': 1}) 
Counter({'red': 6, 'blue': 3, 'pink': 3, 'yellow': 3, 'brown': 2, 'black': 2, 'purple': 1, 'green': 1, 'orange': 1, 'white': 1}) 

所以原則上我可以繪製list_all列表,我會得到一個條形圖,從左側最頻繁的詞開始,到圖表右側最不頻繁的詞。

對於我可能只是使用:

labels_total, values_total = zip(*Counter(list_total).most_common()) 
indexes = np.arange(len(labels_total)) 
plt.bar(indexes, values_total) 
plt.show() 

但我想這兩個列表(而不是組合列表)將被堆疊,所以可以看到從列出的絕大多數詞彙來源於等等。

這就是我卡住的地方。我似乎無法弄清楚如何去做。首先,這兩個名單中的單詞數量並不相同,其次有些單詞甚至沒有共享。因此,在這種情況下,list1blue的值爲index = 0,因爲這是該列表中最頻繁的單詞,但list2red的值爲index = 0,因爲這是該列表中最頻繁的單詞。因此,當試圖堆疊這些red時,它們將被添加到blue,因爲它們具有相同的索引 - 而這當然是錯誤的。 另一方面,這兩個列表甚至沒有相同的單詞,所以計數一切時的大小(索引號)也不相同,因爲list1只有5個不同的單詞,而list2有9個。所以你可以除非尺寸相同,否則不會將它們堆疊在條形圖中。

所以我現在有點迷路了。我可以通過.extend函數通過添加一些零條目來擴展低維列表(僅作爲示例),但排序仍然是錯誤的,因爲它們將被添加/擴展到列表的末尾。

該編碼組合:

import collections 
from collections import Counter 
import numpy as np 
import matplotlib.pyplot as plt 

list1 = ["red", "blue", "yellow", "yellow", "blue", "green", "pink", "red"] 
list2 = ["black", "black", "yellow", "red", "blue", "pink", "pink", "red", "purple", "white", "red", "orange", "red", "brown", "brown"] 
list_total = list1 + list2 

c1 = Counter(list1) 
c2 = Counter(list2) 
c_all = Counter(list_total) 

labels_total, values_total = zip(*Counter(list_total).most_common()) 
indexes = np.arange(len(labels_total)) 
plt.bar(indexes, values_total) 
plt.show() 

回答

1
l1_counter = [] 
l2_counter = [] 
for each in c_all.most_common(): 
...  l1_counter.append(c1.get(each[0],0)) 
...  l2_counter.append(c2.get(each[0],0))` 

然後,你可以這樣做this

它爲什麼有效 - 手頭有2個問題。

  1. 有可能在2只列出不同的顏色,
  2. 根據頻率的順序已被保持。

現在,c_all是一本字典,並遍歷它不會給它們由計數器順序顯示的按鍵,因此,它成爲迫切需要遍歷c_all.most_common()。其次,爲了確保我們考慮了所有顏色,我查看了c1和c2的密鑰c_all得到函數字典返回如果找不到密鑰,則返回存儲的值與密鑰的對應關係。

c1.get(each[0],0) 

在這裏,它變成一個OR條件,其中,如果沒有發現了鍵,則在括號其它值被分配。簡而言之,如果列表中不存在顏色,我將該顏色分配給list_counter,因此它不會顯示在堆疊圖表中。

爲了您的具體的例子 -

c1 
Counter({'blue': 2, 'yellow': 2, 'red': 2, 'pink': 1, 'green': 1}) 
c2 
Counter({'red': 4, 'pink': 2, 'brown': 2, 'black': 2, 'blue': 1, 'purple': 1, 'yellow': 1, 'orange': 1, 'white': 1}) 
c_all 
Counter({'red': 6, 'blue': 3, 'pink': 3, 'yellow': 3, 'brown': 2, 'black': 2, 'purple': 1, 'green': 1, 'orange': 1, 'white': 1}) 
l1_counter 
[2, 2, 1, 2, 0, 0, 0, 1, 0, 0] 
l2_counter 
[4, 1, 2, 1, 2, 2, 1, 0, 1, 1] 

現在你可以更好的連接是怎麼回事。對於在c_all(按順序)中顯示的顏色,我只是在每個列表中堆疊顏色,如果未找到顏色,則分配0。希望這可以幫助。

你可以閱讀更多關於獲取函數或字典在一般here

+0

我知道不應該感謝的人回覆,但是這真的工作就像一個魅力。謝謝。但是,我真的不確定它的實際功能是如何工作的。你可能會開導嗎? –

0

以下應該給你你想要的。

import numpy as np 
import matplotlib.pyplot as plt 

list1 = ["red", "blue", "yellow", "yellow", "blue", "green", "pink", "red"] 
list2 = ["black", "black", "yellow", "red", "blue", "pink", "pink", "red", "purple", "white", "red", "orange", "red", "brown", "brown"] 

listall = list1+list2 
unique = list(set(listall)) 

counts1 = np.array([list1.count(item) for item in unique]) 
counts2 = np.array([list2.count(item) for item in unique]) 
countsall = counts1+counts2 
inx = np.argsort(countsall) 

fig, ax = plt.subplots() 
ax.bar(range(len(countsall)), counts1[inx][::-1], label="list1") 
ax.bar(range(len(countsall)), counts2[inx][::-1], bottom=counts1[inx][::-1], label="list2") 

ax.set_xticks(range(len(countsall))) 
ax.set_xticklabels(([unique[i] for i in inx])[::-1]) 
ax.legend() 

plt.show() 

enter image description here

相關問題