【问题标题】:Python Matplotlib bars subplots by Category and AggregationPython Matplotlib 按类别和聚合排列子图
【发布时间】:2021-04-09 20:13:58
【问题描述】:

我有一张这样的桌子:

data = {'Category':["Toys","Toys","Toys","Toys","Food","Food","Food","Food","Food","Food","Food","Food","Furniture","Furniture","Furniture"], 
        'Product':["AA","BB","CC","DD","SSS","DDD","FFF","RRR","EEE","WWW","LLLLL","PPPPPP","LPO","NHY","MKO"],
       'QTY':[100,200,300,50,20,800,300,450,150,320,400,1000,150,900,1150]}
df = pd.DataFrame(data)
df

输出:

    Category    Product QTY
0   Toys          AA    100
1   Toys          BB    200
2   Toys          CC    300
3   Toys          DD    50
4   Food          SSS   20
5   Food          DDD   800
6   Food          FFF   300
7   Food          RRR   450
8   Food          EEE   150
9   Food          WWW   320
10  Food          LLLLL 400
11  Food          PPPPP 1000
12  Furniture     LPO   150
13  Furniture     NHY   900
14  Furniture     MKO   1150

所以,我需要像这样制作条形图(每个类别中的总产品数):

我的问题是我不知道如何组合类别、系列和聚合。 我设法将它们分成 3 个子图(1 个始终保持空白),但我无法将它们合并...

import matplotlib.pyplot as plt

fig, axarr = plt.subplots(2, 2, figsize=(12, 8))

df['Category'].value_counts().plot.bar(
    ax=axarr[0][0], fontsize=12, color='b'
)
axarr[0][0].set_title("Category", fontsize=18)

df['Product'].value_counts().plot.bar(
    ax=axarr[1][0], fontsize=12, color='b'
)
axarr[1][0].set_title("Product", fontsize=18)

df['QTY'].value_counts().plot.bar(
    ax=axarr[1][1], fontsize=12, color='b'
)
axarr[1][1].set_title("QTY", fontsize=18)

plt.subplots_adjust(hspace=.3)
plt.show()

输出

我需要添加什么来组合它们?

【问题讨论】:

    标签: python pandas matplotlib subplot


    【解决方案1】:

    使用seabornFacetGrid 会容易得多

    import  pandas as pd
    import seaborn as sns
    
    data = {'Category':["Toys","Toys","Toys","Toys","Food","Food","Food","Food","Food","Food","Food","Food","Furniture","Furniture","Furniture"], 
            'Product':["AA","BB","CC","DD","SSS","DDD","FFF","RRR","EEE","WWW","LLLLL","PPPPPP","LPO","NHY","MKO"],
           'QTY':[100,200,300,50,20,800,300,450,150,320,400,1000,150,900,1150]}
    df = pd.DataFrame(data)
    
    g = sns.FacetGrid(df, col='Category', sharex=False, sharey=False, col_wrap=2, height=3, aspect=1.5)
    g.map_dataframe(sns.barplot, x='Product', y='QTY')
    

    【讨论】:

    • 谢谢,这样可以按图表数动态列数吗? (col_wrap=2)
    • 你可以在那里使用任何你想要的东西,例如,因为有 3 个类别,你可以使用 col_wrap=df['Category'].nunique() 它将是 3 宽或 col_wrap=df['Category'].nunique()-1 使其成为 2 宽
    猜你喜欢
    • 2021-11-08
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多