Гистограмма с накоплением в 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]
}

На моей гистограмме с накоплением есть две полосы. Первый содержит все данные из первого значения списка, а второй содержит все вторые значения из списка. (Список - это значения в словаре)

Сначала я конвертирую словарь в кортеж:

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

Это превращает словарь в этот список:

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 при штабелировании. Я сделал их все части одного целого, чтобы обе полоски имели одинаковую высоту. Однако они просто накладываются друг на друга. Также обратите внимание, что у стека есть метка, отличная от их имен в словаре.

вывод гистограммы с накоплением

Пожалуйста, помогите мне отладить !!


person Carmelle    schedule 09.08.2017    source источник


Ответы (1)


Вам нужно будет установить 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
person John Lyon    schedule 09.08.2017
comment
спасибо, что исправили! Я отслеживал текущую высоту так же, как вы предложили, увеличивая ее в цикле for. - person Carmelle; 16.08.2017