Python 从包含多个标签的多个类别中创建分组/堆叠条形图

Python 从包含多个标签的多个类别中创建分组/堆叠条形图,python,pandas,dataframe,plot,Python,Pandas,Dataframe,Plot,我有以下熊猫数据帧df[仅是完整数据帧的摘录]: 我想创建从Cat_1和Cat_2构建的条形图。 这些列包含多个标记,这些标记必须用于打印 目前,我正在运行以下简单代码来绘制Cat_1: 这将为Cat_1中的每个不同标签返回一个漂亮的条形图,允许按预期进行多个指定 可以将其应用于Cat_2,并获得带有相应标签的单独绘图 但是,我希望有一个单独的绘图,首先由Cat_1进行叠加,然后对Cat_2的值进行计数 我想一种方法是构建一个嵌套字典,如下所示: {"P": {"Apples": 2, "Pea

我有以下熊猫数据帧df[仅是完整数据帧的摘录]:

我想创建从Cat_1和Cat_2构建的条形图。 这些列包含多个标记,这些标记必须用于打印

目前,我正在运行以下简单代码来绘制Cat_1:

这将为Cat_1中的每个不同标签返回一个漂亮的条形图,允许按预期进行多个指定

可以将其应用于Cat_2,并获得带有相应标签的单独绘图

但是,我希望有一个单独的绘图,首先由Cat_1进行叠加,然后对Cat_2的值进行计数

我想一种方法是构建一个嵌套字典,如下所示:

{"P": {"Apples": 2, "Pears": 1, "Cats": 2}, "R": {"Apples": 1}, ....}
但同时要记录Cat_1的总计数

它最终是分组条形图还是堆叠条形图并不重要

请查看附图,了解更直观的想法:


如果我理解正确的话,这会让你非常接近

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame(columns=['Name', 'Cat_1', 'Cat_2'])

df['Name'] = ['foo', 'bar', 'bla', 'blu', 'boo', 'faa']
df['Cat_1'] = ['P', 'R, M', 'E', 'F', 'G', 'P, E']
df['Cat_2'] = ['Apples, Pears, Cats', 'Apples', 'Pears', 'Cats, Pears', 'Apples, Pears', 'Apples, Cats']

# arrange data simply prepopulate with zero
df_pl = pd.DataFrame(columns=df["Cat_1"].str.split(", ", expand=True).stack().unique().tolist(),
                     index=df["Cat_2"].str.split(", ", expand=True).stack().unique().tolist(),
                     data=0)

# get chunk size for each combination
for x in df_pl.columns:
    ind = df.Cat_1.str.contains(x)
    for name in df_pl.index:
        df_pl.set_value(name, x, df.loc[ind, 'Cat_2'].str.contains(name).sum())

N = len(df_pl.columns)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence

plotted = []
p = {}
for name in df_pl.index:
    bottoms = df_pl.index.isin(plotted).sum()
    p[name] = plt.bar(ind, df_pl.loc[name].values.tolist(), bottom=bottoms)
    plotted.append(name)

plt.ylabel('y_label')
plt.title('some plot')
plt.xticks(ind, df_pl.columns.tolist())
plt.legend(p.values(), p.keys())

plt.show()

标题要求使用分组条形图。通读之后,您可能需要一个分组条形图,其中每个条形图大致与字符串中的字符长度成比例,然后在其顶部进行注释。这是正确的吗?您是否设置了使用熊猫绘图便利功能?我认为直接使用mpl会更简单,因为你有一个非常具体的情节。@ak_slick我编辑了标题,所以它也适用于mpl方法。谢谢你的评论,谢谢你。下一个澄清。看起来您需要一种带有两个应用程序的堆叠条形图。1将Cat_1放置在X轴上,高度为每个对应Cat_2中包含的字符串总数。然后,你的第二个用例正相反地使用它:在x轴上,每个苹果、梨和猫的P、E和R的总和被分块。我读对了吗?2是首选方式。基本上,对于每个Cat_1总计数,我想创建一个包含Cat_2信息(如果可用)的集群。因此,将一个类别与另一个类别分块以表示contribution@Fourier这就是你要找的吗?
{"P": {"Apples": 2, "Pears": 1, "Cats": 2}, "R": {"Apples": 1}, ....}
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame(columns=['Name', 'Cat_1', 'Cat_2'])

df['Name'] = ['foo', 'bar', 'bla', 'blu', 'boo', 'faa']
df['Cat_1'] = ['P', 'R, M', 'E', 'F', 'G', 'P, E']
df['Cat_2'] = ['Apples, Pears, Cats', 'Apples', 'Pears', 'Cats, Pears', 'Apples, Pears', 'Apples, Cats']

# arrange data simply prepopulate with zero
df_pl = pd.DataFrame(columns=df["Cat_1"].str.split(", ", expand=True).stack().unique().tolist(),
                     index=df["Cat_2"].str.split(", ", expand=True).stack().unique().tolist(),
                     data=0)

# get chunk size for each combination
for x in df_pl.columns:
    ind = df.Cat_1.str.contains(x)
    for name in df_pl.index:
        df_pl.set_value(name, x, df.loc[ind, 'Cat_2'].str.contains(name).sum())

N = len(df_pl.columns)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence

plotted = []
p = {}
for name in df_pl.index:
    bottoms = df_pl.index.isin(plotted).sum()
    p[name] = plt.bar(ind, df_pl.loc[name].values.tolist(), bottom=bottoms)
    plotted.append(name)

plt.ylabel('y_label')
plt.title('some plot')
plt.xticks(ind, df_pl.columns.tolist())
plt.legend(p.values(), p.keys())

plt.show()