我有兩個計數器物件,我想將它們繪制到一個直方圖上。我有這個代碼:
func1_list = ['intronic', 'exonic', 'intronic', 'intronic','exonic', 'intronic', 'intronic']
func2_list = ['intronic', 'intronic','exonic', 'intronic','intronic', 'intronic','exonic', 'intronic']
count1 = Counter(func1_list)
count2 = Counter(func2_list)
key1 = count1.keys()
key2 = count2.keys()
df = pd.DataFrame(count1,index=key1)
df2 = pd.DataFrame(count2,index=key2)
df.plot(kind='bar')
df2.plot(kind='bar')
plt.show()
輸出如下所示:

理想情況下,輸出應該是一個帶有四個條的 x 軸。兩個應該被分組為“intronic”,其中 intronic 中的每個條將是來自 func1_list 和 func2_list 的數字(圖例應該說),然后是另一組稱為 exonic 的兩個條,其中該組中的每個條將是func1_list 和 func2_list。
沒有錯誤,但你可以看到這也不會發生,我認為它繪制了完全相同的串列,兩次。有人可以解釋我做錯了什么嗎?
uj5u.com熱心網友回復:
我運行了你的代碼。我原來df看起來像
intronic exonic
intronic 5 2
exonic 5 2
和df2類似,只是6在第一列中而不是5. 我不確定為什么每個 DataFrame 會有兩個相同的行。我不明白這種行為。但是,正是這樣的行為是df.plot,在繪圖的 x 軸上必須有兩個刻度,標記為intronic和extronic(因為這些是索引),并且 x 軸上的每個刻度都有兩個條,標記為intronic和extronic(因為這些是 DataFrame 中的列名)。由于每次呼叫df.plot都會回傳一組新的軸,因此每個條形圖都放置在單獨的圖中。
因此,解決方案必須是將兩個Counter-objects 放入同一個 DataFrame 中。這可以通過傳遞一個計數器串列并給它們適當的索引來完成
df = pd.DataFrame([count1, count2], index=['func1_list', 'func2_list'])
這使 DataFrame 看起來像
intronic exonic
func1_list 5 2
func2_list 6 2
索引給出了 x 軸上的刻度標簽,我們希望它們是intronic和extronic。這可以通過轉置 DataFrame 來實作
df = df.transpose()
最后,
df.plot(kind='bar')
plt.tight_layout() # to make sure that x-axis labels are always shown fully
plt.show()

產生期望的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/433233.html
標籤:Python matplotlib
