python 如何从多索引 Dataframe 中绘制多个饼图或条形图?

eoxn13cs  于 2023-03-16  发布在  Python
关注(0)|答案(3)|浏览(275)

Dataframe 如下所示。
有多个索引,如category_1category_2;两列,如count%
我需要为category_2%绘制多个(每个category_1)饼图,为category_2count绘制条形图。
| | | 计数|百分比|
| - ------|- ------|- ------|- ------|
| 类别_1|类别_2|||
| 婴儿和儿童|婴儿护理|二百二十|二十七点五|
| | 玩具|一百七十六|二十二|
| | 男孩服装|一百五十六|十九点五|
| | 女孩服装|一百四十四|十八|
| | 男婴服装|一百零四|十三|
| 女装|派对礼服|二百二十四|二十八|
| | 运动服|一八八|二十三点五|
| | 泳装|一百四十|十七点五|
| | 冬季服装|一百二十八|十六|
| | 手表|一百二十|十五|

vc6uscn9

vc6uscn91#

您可以使用以下代码为多索引 Dataframe 中的每个category_1绘制饼图和条形图:

import pandas as pd
import matplotlib.pyplot as plt

# create a sample dataframe
data = {
    ('Bady and Kids', 'Baby Care'): (220, 27.5),
    ('Bady and Kids', 'Toys'): (176, 22),
    ('Bady and Kids', 'Boys Clothing'): (156, 19.5),
    ('Bady and Kids', 'Girls Clothing'): (144, 18),
    ('Bady and Kids', 'Baby Boy Clothing'): (104, 13),
    ("Women's wear", 'Party Dresses'): (224, 28),
    ("Women's wear", 'Sports Wear'): (188, 23.5),
    ("Women's wear", 'Swim wear'): (140, 17.5),
    ("Women's wear", 'Winter Wear'): (128, 16),
    ("Women's wear", 'Watches'): (120, 15)
}
df = pd.DataFrame(data.values(), index=pd.MultiIndex.from_tuples(data.keys(), names=['category_1', 'category_2']), columns=['count', '%'])

# plot pie charts and bar charts for each category_1
for category_1 in df.index.get_level_values(0).unique():
    sub_df = df.loc[category_1]
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
    sub_df.plot(kind='pie', y='%', legend=None, ax=ax1)
    ax1.set_title(f'{category_1} - %')
    sub_df.plot(kind='bar', y='count', legend=None, ax=ax2)
    ax2.set_title(f'{category_1} - count')
    plt.show()

这段代码创建了一个循环来迭代category_1的每个唯一值。在循环中,它提取当前category_1的子 Dataframe ,然后使用sub_df.plot()为%列绘制饼图,为count列绘制条形图。最后,它设置每个图表的标题,并使用plt.show()显示它们。
这将输出一组饼图和条形图,每个饼图和条形图对应一个唯一的category_1。
以下是示例图表:

5us2dqdw

5us2dqdw2#

您可以用途:

for cat1, subdf in df.groupby(level='category_1'):
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
    subdf.loc[cat1, :].plot.pie(y='count', ax=ax1, ylabel='', legend=False)
    subdf.loc[cat1, :].plot.bar(y='%', ax=ax2, rot=45, xlabel='', legend=False)
    fig.suptitle(cat1)
    fig.tight_layout()
    plt.show()

输出:

z31licg0

z31licg03#

您可以用途:

#gt number of groups first for subplots
no = len(df.index.levels[0])
fig, axes = plt.subplots(no, 2, figsize=(10, 6))

#for each group by first level of Multiindex
for i, (name, g) in enumerate(df.groupby(level=0)):
    #remove first level and index name
    g = g.droplevel(0).rename_axis(None)

    #get positions dynamic
    ax =  axes[i, 0]
    ax1 = axes[i, 1]

    #plot both graphs together
    g['count'].plot.pie(ax=ax, legend=False)
    ax.set_title(f'{name} %')
    g['%'].plot.bar(ax=ax1, legend=False, rot=45)
    ax1.set_title(f'{name} count')

fig.subplots_adjust(wspace=.2)

相关问题