2014-02-21 68 views
1

如果我有話字典和他們在一個字符串的頻率,例如:使用字典來製作matplotlib圖形?

{'hello': 3, 'how': 4, 'yes': 10, 'you': 11, 'days': 10, 'are': 20, 'ago': 11} 

我怎麼可能讓一個柱狀圖出這個使用matplotlib的?我發現了一個問題,以前它有一個看似不錯的解決方案,但它並沒有爲我工作(python: plot a bar using matplotlib using a dictionary

當我運行

plt.bar(range(len(d)), d.values(), align="center") 
plt.xticks(range(len(d)), d.keys()) 

我得到的錯誤

TypeError: 'dict_keys' object does not support indexing 

我不我真的不知道我在索引我的詞典。這可能是因爲在我得到代碼的問題中,x值也是數字?我不確定。

回答

8

嘗試包裝你的d.keys()list()電話:

plt.bar(range(len(d)), d.values(), align="center") 
plt.xticks(range(len(d)), list(d.keys())) 

在Python3,dict.keys()不直接返回鍵的列表,而是返回一個生成器,將鑰匙給你一個在時間你用吧。

+0

工作很完美,謝謝!我會記住dict.keys()是如何工作的。 – Howcan

+0

這與我的問題不是很相關,但是有什麼辦法可以自動化這些條之間的空間,以便所有單詞都可以放在x軸上(或者可以讓這些單詞放到一個新行上?) – Howcan

+0

@Howcan也許你想將長詞分成多行? – zhangxaochen

1

「有什麼辦法,我可以自動化杆之間的空間,使所有的話可以安裝在x軸(或可能做出的話去到一個新的行?)」

我將分裂長字到多行,例如,'looooooooongWord''looooo-\noooong-\nWord'

In [300]: d={'hello': 3, 'how': 4, 'yes': 10, 'you': 11, 'days': 10, 'are': 20, 'ago': 11, 'looooooooongWord': 10} 
    ...: plt.bar(range(len(d)), d.values(), align="center") 
    ...: plt.xticks(range(len(d)), [split_word(i) for i in d.keys()]) 

其中split_word定義爲:

In [595]: def split_word(s): 
    ...:  n=6 
    ...:  return '-\n'.join(s[i:i+n] for i in range(0, len(s), n)) 
    ...: split_word('looooooooongWord') 
Out[595]: 'looooo-\noooong-\nWord' 

enter image description here