2017-08-09 28 views
1

こんにちは私はかなり新しいmatplotlibですが、積み上げ棒グラフをプロットしようとしています。スタッキングする代わりに、私のバーは互いに重なっています。Matplotlib積み上げ棒グラフ

これは私がデータを保存している辞書です。

eventsDict = { 
'A' : [30.427007371788505, 3.821656050955414], 
'B' : [15.308879925288613, 25.477707006369428], 
'C' : [10.846066723627477, 1.910828025477707], 
'D' : [0.32586881793073297, 0.6369426751592357], 
'E' : [3.110656307747332, 11.464968152866243], 
'F' : [8.183480040534901, 1.910828025477707], 
'G' : [3.048065650644783, 16.560509554140125], 
'H' : [9.950920976811652, 4.45859872611465] 
} 

スタックされた棒グラフには2つのバーがあります。最初の値にはリストの最初の値のすべてのデータが含まれ、2番目の値にはリストの2番目の値がすべて含まれます。 (リスト辞書内の値である)

まず、私はタプルに辞書を変換:

allEvents = list(self.eventsDict.items()) 

これは、このリストに辞書をオン:ここで、I

all Events = [('A', [30.427007371788505, 3.821656050955414]), ('B', [15.308879925288613, 25.477707006369428]), ('C', [10.846066723627477, 1.910828025477707]), ('D', [0.32586881793073297, 0.6369426751592357]), ('E', [3.110656307747332, 11.464968152866243]), ('F', [8.183480040534901, 1.910828025477707]), ('G', [3.048065650644783, 16.560509554140125]), ('H', [9.950920976811652, 4.45859872611465])] 

これはプロットする:

range_vals = np.linspace(0, 2, 3) 
    mid_vals = (range_vals[0:-1] + range_vals[1:]) * 0.5 
     colors = ['#DC7633', '#F4D03F', '#52BE80', '#3498DB', '#9B59B6', '#C0392B', '#2471A3', '#566573', '#95A5A6'] 
     x_label = ['All events. %s total events' % (totalEvents), 'Corrected p-value threshold p < %s. %s total events' % (self.pVal, totalAdjusted)] 

    #Turn the dict to a tuple. That way it is ordered and is subscriptable. 
    allEvents = list(self.mod_eventsDict.items()) 
    #print (allEvents) 

    #Use below to index: 
    #list[x] key - value pairing 
    #list[x][0] event name (key) 
    #list[x][1] list of values [val 1(all), val 2(adjusted)] 

    #Plot the Top bar first 
    plt.bar(mid_vals, allEvents[0][1], color = colors[0], label = allEvents[0][0]) 

    #Plot the rest 
    x = 1 
    for x in range(1, 20): 
     try: 
      plt.bar(mid_vals, allEvents[x-1][1], bottom =allEvents[x-1][1], color = colors[x], label = allEvents[x][0])   
      x = x + 1 
     except IndexError: 
      continue 


    plt.xticks(mid_vals) # for classic style 
    plt.xticks(mid_vals, x_label) # for classic style 

    plt.xlabel('values') 
    plt.ylabel('Count/Fraction') 
    plt.title('Stacked Bar chart') 
    plt.legend() 
    plt.axis([0, 2.5, 0, 1]) 
    plt.show() 

グラフの出力です。理想的には、積み重ねるとすべて1になります。私は両方のバーが同じ高さになるように、それらを1つの全体の一部分にしました。しかし、それらはお互いに重なるだけです。また、スタックの名前はディクショナリ上の名前とは異なります。

stacked bar graph output

私はデバッグを助けてください!

答えて

0

bottomを別に設定する必要があります。これは、プロットしているバーの下部を配置する場所をmatplotlibに指示するので、前に来たバーの高さの合計である必要があります。

次の例のようにのようにリストでバーの現在の高さを追跡することができます:それを固定

current_heights = [0] * 20 
for x in range(20): 
    try: 
     plt.bar(mid_vals, allEvents[x][1], bottom=current_heights[x], color=colors[x], label=allEvents[x][0])   
     x = x + 1 
     current_heights[x] += allEvents[x][1] #increment bar height after plotting 
    except IndexError: 
     continue 
+0

感謝を!私は現在の高さをforループでインクリメントして提案したのと同じように追跡しました。 – Carmelle

関連する問題