如何根据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函数制作的表格绘制多条形图?的主要内容,如果未能解决你的问题,请参考以下文章
如何制作一个以用户定义的表类型为参数并在sql中返回相同的函数?
Python Dataframe:在一列上使用Groupby计算R ^ 2和RMSE