Как создать собственную диаграмму Python, используя matplotlib - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь сделать сильно настроенную диаграмму, используя Matplotlib (открыт для использования любой другой библиотекой).

Данные, которые у меня есть, выглядят так

ItemID | ItemPhase | ItemStatus | ItemOutcome |  Date      
  1        Phase1     Complete       In         01-02-2011
  2        Phase2       WIP          WIP        01-03-2014
  3        Phase1     Complete       Out        05-02-2010
  4        Phase3       WIP          WIP        01-04-2015
  5        Phase2     Complete       In         01-05-2012
  6        Phase2       WIP          WIP        01-02-2013
  7        Phase3     Complete       In         01-06-2015
  8        Phase2     Complete       Out        01-07-2013

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

Дата полезна только для получения ItemPhase, основываясь на дате, фазаопределен.

Мне бы хотелось, чтобы диаграмма выглядела следующим образом: enter image description here

Как видно из изображения, раздел «Исходы элементов» построен изрезультат раздела «Состояние предметов».

Я изо всех сил пытался начать или получить представление о том, как построить это, поэтому любая помощь очень ценится.

Спасибо за вашу поддержку!

1 Ответ

0 голосов
/ 29 мая 2018

Вот несколько указателей, с которых можно начать.

Допустим, у вас есть ваш фрейм данных как df, и вы хотите построить ItemStatus ячейки для Phase2:

df = df[df['ItemPhase'] == 'Phase2']
total = df['ItemStatus'].count()

Первое, что вы можете построить, это пунктирная полоса с количеством предметов.Если каждая ячейка status имеет высоту 1.0 (для разделения на Complete и WIP проценты), мы можем выделить что-то вроде 40% (height=1.4) большедля метки.

ax.bar(0, 1.4, width=1, edgecolor='black', lw=1, ls='dotted', color="white")

Теперь давайте построим основную часть, вам нужен первый бар, который идет от 0 до частоты ItemStatus == WIP, и второй бар, который начинается с этой частоты и идет вверх.к одному.Вы можете получить каждый счетчик состояний с помощью value_counts и разделить на total, чтобы получить проценты.

bottom = 0
for i, s in enumerate(df['ItemStatus'].value_counts().iteritems()):
    label, count = s
    freq = count / float(total)

    r, = ax.bar(0, freq, width=1, bottom=bottom, color=bg[i], edgecolor='black', lw=3)

    ax.text(r.get_x() + r.get_width()/2.,
            r.get_y() + r.get_height()/2.,
            '{}% ({}) Items {}'.format(int(freq * 100), count, label),
            ha="center", va="center", color=fg[i])

    bottom += freq

Теперь вам просто нужна метка n Items.Вы можете использовать самые последние гистограммы r координаты, чтобы правильно отцентрировать его.

ax.text(r.get_x() + r.get_width()/2., 1.2,
        '{} Items'.format(total),
        ha="center", va='center', color='black')

И вот что вы получите

enter image description here

Теперь вам нужно:

  • найти какой-нибудь хороший pandas способ перебрать все ячейки
  • использовать информацию о дате для оси x
  • добавить дополнительныеэтикетки типа Phase x, Item Status и т. д.
...