Составной график - PullRequest
       5

Составной график

0 голосов
/ 28 июня 2018

Я пытаюсь воспроизвести такую ​​диаграмму:

target bar

Итак, гистограмма с несколькими столбцами с накоплением и с несколькими столбцами.

Ближе всего я подхожу к этому коду:

import matplotlib.pyplot as plt

fooMeans = (20, 35, 30, 35, 27)
barMeans = (25, 32, 34, 20, 25)

ind = list(range(len(fooMeans)))

p1 = plt.bar(ind, barMeans, align='edge', width= 0.4)
p2 = plt.bar(ind, fooMeans, align='edge', width= 0.2)
p3 = plt.bar(ind, barMeans, bottom=fooMeans, align='edge', width= 0.2)
p4 = plt.bar(ind, fooMeans, align='edge', width= -0.2)

plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(range(0, 81, 10))


plt.legend((p1[0], p2[0], p3[0], p4[0]), ('Foo', 'Bar','Fii', 'Fuu'))


plt.savefig('foo.png', bbox_inches='tight')

Что рисует это:

closest bar

Это не так уж и плохо, но галочки x не выровнены (возможно, из-за align = 'edge' бара) и трюка ширины, который я использую, чтобы показать панель рядом друг с другом (а не рисовать всю панель один поверх другого) вроде как взломать, есть ли по книгам способ сделать это?

1 Ответ

0 голосов
/ 28 июня 2018

Хорошо, поэтому я найду более чистый путь.

Лучше всего играть со списком позиций x (в моем предыдущем примере кода). Итак, я придумал небольшую функцию, которая может справиться с этим для меня:

def make_indice_list(indices, bar_number, bar_width, spacing_ratio=0):

    # "Center" the bar number around 0, not clear but if you have 3 bar, 
    # bar_number_indices = [-1, 0, 1]
    bar_number_indices = [i - int(bar_number/2) for i in range(bar_number)]

    indices_list = []
    for number in bar_number_indices:

        indices_list.append([ ( ((number* bar_width) + (spacing_ratio*bar_width) * number) + ind) for ind in indices])

    return indices_list

И я делаю это, чтобы использовать его:

indice_list = make_indice_list(ind, 3, 0.2, 0.1)
p1 = plt.bar(indice_list[0], barMeans, width= 0.2)
p2 = plt.bar(indice_list[1], fooMeans, width= 0.2)
p3 = plt.bar(indice_list[1], barMeans, bottom=fooMeans, width= 0.2)
p4 = plt.bar(indice_list[2], fooMeans, width= -0.2)

Больше нет ни центра, ни странной ширины, вы просто должны использовать те же индексы для столбца с накоплением (и при вызове функции учитывайте их как единое целое).

В конце нарисуйте это:

enter image description here

Возможно, вы могли бы внести некоторые улучшения в функцию make_indice_list, в основном удаляя список пониманий и используя пустой список, но я думаю, что это хорошее решение для меня.

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