Python & Matplotlib: использование Numpy.Array для гистограммы с накоплением - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь отобразить график, который включает в себя мои данные, используя гистограммы с накоплением. Мои данные;

new_total = [[5,3,11,17,2,1,5,38,30,45,15,0],[8,21,13,54,21,7,20,103,114,149,77,15],[0,2,6,7,2,6,2,6,22,0,3,0],[0,9,3,11,10,0,0,26,47,17,7,9],[0,11,4,2,5,1,10,35,35,19,16,0],[0,0,0,2,0,0,2,5,6,16,4,3]]

Он имеет 6 элементов, и каждый элемент представляет цвет (и каждый элемент имеет 12 подэлементов). Объяснить с моими кодами и картинками;

width = 0.5
ind = np.arange(N)  # the x locations for the groups
temp = []
myMax = 0
myCount = 0
for x in range(len(movies)):
    myCount = myCount + 1
    if myCount == 1:
        self.axes.bar(ind, new_total[0], width)
        temp = np.zeros(N)
    else:
        if x == len(movies) - 1:
            myMax = max(np.add(temp, new_total[x - 1]))
        self.axes.bar(ind, new_total[x], width, bottom=np.add(temp, new_total[x - 1]))

Если я использую этот код выше; отображается этот график . Как вы видите, например; фиолетовая область где-то в синей области. И все цифры (как вы видите слева) неверны.

Но если я использую этот код ниже;

self.axes.bar(ind, new_total[0], width)
self.axes.bar(ind, new_total[1], width, bottom=np.array(new_total[0]))
self.axes.bar(ind, new_total[2], width, bottom=np.add(new_total[0],new_total[1])) #I could use np.array(new_total[0]) + np.array(new_total[1])
self.axes.bar(ind, new_total[3], width, bottom=np.array(new_total[0]) + np.array(new_total[1]) + np.array(new_total[2]))
self.axes.bar(ind, new_total[4], width, bottom=np.array(new_total[0]) + np.array(new_total[1]) + np.array(new_total[2]) + np.array(new_total[3]))
self.axes.bar(ind, new_total[5], width, bottom=np.array(new_total[0]) + np.array(new_total[1]) + np.array(new_total[2]) + np.array(new_total[3]) + np.array(new_total[4]))

Этот график отображается, и это тот график, который я хочу, который отлично показывает цвета и общее количество. Но я думаю, что это решение настолько примитивно. Потому что иногда new_total будет иметь 5 или 7 элементов. Можете ли вы исправить мое решение идеальным способом (он может иметь цикл или что-то еще)

1 Ответ

1 голос
/ 10 апреля 2019

Я не проверял код, так как у вас есть классы, и это не совсем минимальный рабочий фрагмент. Однако, как видно из вашего последнего примера, вы увеличиваете индекс на 1 (кажется, отлично подходит для for loop). Затем вы видите, что bottom всегда является суммой всех предыдущих элементов, что опять-таки хорошо сочетается с циклом for, но здесь нотация срезов оказывается полезной. Итак, учитывая это, код должен выглядеть примерно так:

for i, sublist in enumerate(new_total):
    self.axes.bar(ind, sublist, bottom=np.sum(new_total[0:i], axis=0), width=width)

Небольшое предостережение - использовать функцию np.sum () с axis=0, которая будет суммировать ваш массив поэлементно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...