4

我一直在尝试使用 plotnine 绘制堆积条形图。此图表示同一“类别”中的月末库存。“子类别”是应该堆叠的。

我已经构建了一个从查询到数据库的 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')  

其中 subcategories 是具有 SubCategories 名称的字典。

也许数据框的格式并不理想。或者我不知道如何正确使用它与 plotnine/ggplot。

谢谢您的帮助。

4

2 回答 2

2

您需要格式整齐的数据

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'))
)

结果图

于 2019-09-25T12:42:05.887 回答
1

你真的需要使用plotnine吗?你可以这样做:

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

输出:

在此处输入图像描述

于 2019-09-24T16:48:53.293 回答