Подзаголовки столбцов Matplotlib на Python по категориям и агрегации

#python #pandas #matplotlib #subplot

#python #pandas #matplotlib #подзаголовок

Вопрос:

У меня есть такая таблица:

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

Вон
введите описание изображения здесь

Что мне нужно добавить, чтобы объединить их?

Ответ №1:

Это было бы намного проще с seaborn помощью и FacetGrid

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

введите описание изображения здесь

Комментарии:

1. Спасибо, возможно ли сделать динамическое количество столбцов по количеству диаграмм? (col_wrap=2)

2. Вы можете использовать там все, что захотите, например, поскольку существует 3 категории, вы могли бы использовать col_wrap=df['Category'].nunique() , и это было бы шириной в 3 или col_wrap=df['Category'].nunique()-1 сделать его шириной в 2