如何根据python中.groupby函数制作的表格绘制多条形图?

Posted

技术标签:

【中文标题】如何根据python中.groupby函数制作的表格绘制多条形图?【英文标题】:How to draw a multi-bar graph based off a table made by .groupby function in python? 【发布时间】:2022-01-20 17:54:31 【问题描述】:

我似乎在将此表(使用 group by 函数从数据框生成)转换为我需要的图表时遇到了一些问题。该表格由 10 个问题组成,要求用户以 1 到 5 的等级回答这些问题以及每种性别的平均答案。

Gender Q1 Q2 .......
0(male) 3.7 1.3
1(Female) 2.8 3.1
2(Other) 4.2 4.7

它看起来像这张表,除了它包含所有 10 个问题。目前,当我使用带有此表名称的 .plot 函数时,它正在绘制不正确的图形。它正在绘制此图:

当我希望用 3 个不同的条形表示每个问题的 3 个性别而不是这个图表时。然后 10 个问题中的每一个都将沿着 x 轴移动。任何有关如何实现这一点的帮助将不胜感激。

【问题讨论】:

我用对数据框外观的新猜测更新了我的答案 【参考方案1】:

不清楚您的数据是如何组织的,也不清楚您是如何创建表格的。

假设输入数据有 3 列:'gender'、'question'、'mark'。以下是该表格中的一些数据,以便能够进行测试:

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

df = pd.DataFrame('gender': np.random.choice(['male', 'female', 'other'], 1000),
                   'question': pd.Categorical.from_codes(codes=np.random.randint(0, 10, 1000),
                                                         categories=[f'Qi' for i in range(1, 11)]),
                   'mark': np.random.randint(1, 6, 1000))
df['gender'] = pd.Categorical(df['gender'], categories=['male', 'female', 'other'])  # fix an order

然后您可以通过df.pivot_table(index='gender', columns='question', values='mark') 创建一个表格并将其绘制为条形,类似于问题的图像:

df.pivot_table(index='gender', columns='question', values='mark').plot.bar(rot=0, width=0.8)

现在,反过来创建 pivot_table 会将问题作为 x 位置,将性别作为颜色:

df.pivot_table(index='question', columns='gender', values='mark').plot.bar(rot=0, width=0.8)

如果您的表格已经创建,您可以在绘图之前对其进行转置,这也会导致 x 轴的问题:

df_table = df.pivot_table(index='gender', columns='question', values='mark')
df_table.T.plot.bar(rot=0, width=0.8)

另一种方法是使用 seaborn,它直接从原始数据框创建条形图,并且(可选)显示误差线(使用 ci=None 抑制误差线)。你只需告诉 seaborn 你想在 x 轴上看到什么,在 y 轴上看到什么,以及彩色分隔的什么。

import seaborn as sns

ax = sns.barplot(data=df, x='question', y='mark', hue='gender')
ax.legend(bbox_to_anchor=[1.01, 1.01], loc='upper left')
plt.tight_layout()
plt.show()

现在,如果您的数据框如下所示:

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

df = pd.DataFrame('Gender': np.arange(3),
                   **f'Qi': np.random.randint(15, 46, 3) / 10 for i in range(1, 11))

例如:

  Gender   Q1   Q2   Q3   Q4   Q5   Q6   Q7   Q8   Q9  Q10
0      0  3.9  2.7  2.2  2.6  2.2  2.8  2.2  3.2  2.9  2.9
1      1  4.2  2.0  4.4  2.4  3.6  2.1  1.6  4.0  2.7  4.2
2      2  3.7  3.9  4.2  2.9  3.2  4.4  4.2  2.1  2.9  3.6

您可以使用适当的名称将“性别”列分类,将其用作索引,转置数据框并绘制:

df['Gender'] = pd.Categorical.from_codes(df['Gender'], categories=['Male', 'Female', 'Other'])
df.set_index('Gender').T.plot.bar(rot=0, width=0.8)

【讨论】:

您好,我无法使用数据透视表功能,因为我无法访问表中的索引、列和值,因为它们的命名方式与您在表初始化时的命名方式不同。由于我的表是从更大的数据集中提取的,我不确定如何访问这 3 个,因为它们没有使用像你这样的标题进行初始化 您知道如何标记所有列并标记索引和值,以便我可以使用您的方法吗? 好吧,您能edit您的帖子并添加有关您的数据的更多信息吗?如果原始列有其他名称,您仍然可以稍后重命名数据透视表的行/列。如果没有来自您的数据的更多信息,很难猜测到底需要发生什么。也许您可以添加数据的简化版本(但它显示了一般结构)?如果您问题中的表格是数据框,您可以尝试转置它:df.T.plot.bar() 转置数据框工作非常感谢 但是,条形图是正确的,只是它包含性别作为其 x 轴刻度,即使性别不应包含在 x 轴中,因为它由每个问题的不同条形表示。

以上是关于如何根据python中.groupby函数制作的表格绘制多条形图?的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 根据数据框 groupBy 制作多个文件

Python数据分析分组统计groupby

如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?

Python Dataframe:在一列上使用Groupby计算R ^ 2和RMSE

python pandas groupby分组后的数据怎么用

python groupby