Python Plotnine - Создайте столбчатую диаграмму с накоплением - PullRequest
3 голосов
/ 24 сентября 2019

Я пытался нарисовать гистограмму с использованием плотнина.Этот график представляет инвентаризацию на конец месяца в той же «Категории».«Подкатегория» это то, что должно быть сложено.

Я создал фрейм данных pandas из запроса к базе данных.Запрос извлекает сумму (инвентарь) для каждой «подкатегории» в «категории» в диапазоне дат.

Это формат DataFrame:

     SubCategory1    SubCategory2    SubCategory3  ....   Dates
0      1450.0            130.5            430.2    ....  2019/Jan 
1      1233.2           1000.0             13.6    ....  2019/Feb
2      1150.8            567.2            200.3    ....  2019/Mar

Даты должны быть вось X и Y должны определяться суммой "SubCategory1" + "SubCategory2" + "SubCategory3" и различимостью цветов.

Я пробовал это, потому что думал, что это имеет смысл, но не повезло:

g = ggplot(df)    
for key in subcategories: 
    g = g + geom_bar(aes(x='Dates', y=key), stat='identity', position='stack')  

Где подкатегории - это словарь с именем подкатегории.

Возможно, формат данных не идеален.Или я не знаю, как правильно использовать его с plotnine / ggplot.

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Вам нужны данные в аккуратном формате

from io import StringIO
import pandas as pd
from plotnine import *
from mizani.breaks import date_breaks

io = StringIO("""
SubCategory1    SubCategory2    SubCategory3     Dates
1450.0            130.5            430.2      2019/Jan 
1233.2           1000.0             13.6      2019/Feb
1150.8            567.2            200.3      2019/Mar
""")

data = pd.read_csv(io, sep='\s+', parse_dates=[3])

# Make the data tidy
df = pd.melt(data, id_vars=['Dates'], var_name='categories')

"""
       Dates    categories   value
0 2019-01-01  SubCategory1  1450.0
1 2019-02-01  SubCategory1  1233.2
2 2019-03-01  SubCategory1  1150.8
3 2019-01-01  SubCategory2   130.5
4 2019-02-01  SubCategory2  1000.0
5 2019-03-01  SubCategory2   567.2
6 2019-01-01  SubCategory3   430.2
7 2019-02-01  SubCategory3    13.6
8 2019-03-01  SubCategory3   200.3
"""

(ggplot(df, aes('Dates', 'value', fill='categories'))
 + geom_col()
 + scale_x_datetime(breaks=date_breaks('1 month'))
)

Result Plot

1 голос
/ 24 сентября 2019

Вам действительно нужно использовать plotnine?Вы можете сделать это с помощью:

df.plot.bar(x='Dates', stacked=True)

Вывод:

enter image description here

...