Python中的比例条形图
我有一个这样的数据集Python中的比例条形图,python,bar-chart,Python,Bar Chart,我有一个这样的数据集 Customer_ID Country Gender Premium_account C_01 A M Yes C_02 A F No C_03 A F Yes C_04 A M Yes C_05 A M No C_06 B M No C_07 B
Customer_ID Country Gender Premium_account
C_01 A M Yes
C_02 A F No
C_03 A F Yes
C_04 A M Yes
C_05 A M No
C_06 B M No
C_07 B M No
C_08 B M Yes
C_09 B F Yes
C_10 B F No
C_11 B F No
现在,我想为每个性别的Premium\u账户
百分比进行绘图,并按国家分开。我想知道如何使用Python软件包生成如所附图像中所示的比例条形图。实际上,我不确定我应该使用哪些软件包,因此,到目前为止,我真的无法提供我的任何代码。如果您能提供任何帮助,我将不胜感激。提前谢谢!
这里有一种方法可以获得想要的结果
导入并创建数据帧
解决方案
首先,我们将Premium\u account
和Gender
列映射为二进制,这样我们就可以对它们进行数学运算
df.Premium_account = df.Premium_account.map({'Yes': 1, 'No': 0})
df.Gender = df.Gender.map({'F': 1, 'M': 0})
df
Customer_ID Country Gender Premium_account
0 C_01 A 0 1
1 C_02 A 1 0
2 C_03 A 1 1
3 C_04 A 0 1
4 C_05 A 0 0
5 C_06 B 0 0
6 C_07 B 0 0
7 C_08 B 0 1
8 C_09 B 1 1
9 C_10 B 1 0
10 C_11 B 1 0
接下来,我们使用pandas
“groupby
方法,按性别计算每个国家拥有溢价账户的人口比例
account_proportions = ((df
.groupby(['Country', 'Gender'])
.Premium_account.sum() / df.Premium_account.sum())
.unstack('Gender')
)
account_proportions
Gender 0 1
Country
A 0.4 0.2
B 0.2 0.2
接下来,我们按行标准化数据帧。这是给我们一个比例图,而不仅仅是一个堆叠的条形图
account_proportions = account_proportions.div(account_proportions.sum(axis=1), axis=0)
account_proportions
Gender 0 1
Country
A 0.4 0.2
B 0.2 0.2
最后,我们可以使用pandas
自己的内置绘图方法来绘制堆叠条形图。请注意,我们保存了由plot.bar()
方法返回的axis对象,这样我们就可以将图例条目修复回“男性”和“女性”。我们还在调用plot.bar()
时指定标题。我们还使用rot
参数来确保x轴标签符合要求
ax = account_proportions.plot.bar(stacked='True',
title='Premium Account Customer Plot',
rot=0)
ax.legend(['Male', 'Female'])
当然,还可以做其他事情,如or(请添加y轴标签),但这将为您提供大部分方法。这里有一种方法可以获得所需的结果
导入并创建数据帧
解决方案
首先,我们将Premium\u account
和Gender
列映射为二进制,这样我们就可以对它们进行数学运算
df.Premium_account = df.Premium_account.map({'Yes': 1, 'No': 0})
df.Gender = df.Gender.map({'F': 1, 'M': 0})
df
Customer_ID Country Gender Premium_account
0 C_01 A 0 1
1 C_02 A 1 0
2 C_03 A 1 1
3 C_04 A 0 1
4 C_05 A 0 0
5 C_06 B 0 0
6 C_07 B 0 0
7 C_08 B 0 1
8 C_09 B 1 1
9 C_10 B 1 0
10 C_11 B 1 0
接下来,我们使用pandas
“groupby
方法,按性别计算每个国家拥有溢价账户的人口比例
account_proportions = ((df
.groupby(['Country', 'Gender'])
.Premium_account.sum() / df.Premium_account.sum())
.unstack('Gender')
)
account_proportions
Gender 0 1
Country
A 0.4 0.2
B 0.2 0.2
接下来,我们按行标准化数据帧。这是给我们一个比例图,而不仅仅是一个堆叠的条形图
account_proportions = account_proportions.div(account_proportions.sum(axis=1), axis=0)
account_proportions
Gender 0 1
Country
A 0.4 0.2
B 0.2 0.2
最后,我们可以使用pandas
自己的内置绘图方法来绘制堆叠条形图。请注意,我们保存了由plot.bar()
方法返回的axis对象,这样我们就可以将图例条目修复回“男性”和“女性”。我们还在调用plot.bar()
时指定标题。我们还使用rot
参数来确保x轴标签符合要求
ax = account_proportions.plot.bar(stacked='True',
title='Premium Account Customer Plot',
rot=0)
ax.legend(['Male', 'Female'])
当然,还有其他一些事情可以做,比如or(请添加y轴标签),但这将为您提供大部分方法。理想情况下,您应该提供一些代码来显示您所做的尝试。您能否至少详细说明一下您正在使用的库(pandas
将很好地处理此问题)以及您希望如何绘制(例如,Customer\u ID
、Country
和Gender
中的哪一个是您想要绘制的Premium\u账户
?谢谢Chris的建议。我已经相应地更新了问题。但是,我真的不知道我应该采取什么方法来解决这个问题,因此,我无法提供我的任何编码。我真的很抱歉。)感谢您的帮助。matplotlib
非常适合绘制图形。在这里找到了堆叠图形用法:谢谢@drd。这是一个非常好的建议!理想情况下,您应该提供一些代码来显示您尝试过的内容。您是否至少可以详细说明您正在使用的库(pandas
将很好地处理此问题)你想要怎样的情节(例如,Customer\u ID
、Country
和Gender
中的哪一个是您想要绘制的Premium\u账户
?谢谢Chris的建议。我已经相应地更新了问题。但是,我真的不知道我应该采取什么方法来解决这个问题,因此,我无法提供我的任何编码。我真的很抱歉。)感谢您的帮助。matplotlib
非常适合绘制图形。在此处找到堆叠图形用法:谢谢@drd。这是一个非常好的建议!