Python Stacked Bar按类别着色

时间:2017-04-30 21:20:53

标签: python python-3.x

我有一个csv数据集,如下所示:

Account     Months_since_Open      Gender      Age_Group
XXXXX              12               Male       Millennial
YYYYY              24               Female        71+
ZZZZZ              20               Female        55-70

数据集持续数百万行。基本上我想要一个条形图,它在x轴上有Months_Since_Open,在Y轴上有一个帐户数(频率)。此外,我希望这些酒吧按年龄组着色。

到目前为止,这就是我所拥有的:

import pandas as pd 
import numpy as np 
import statsmodels.api as sm 
import pylab as pl 
from scipy import stats 
from sklearn.externals.six import StringIO 
from sklearn import preprocessing 
from sklearn import cluster, tree, decomposition 
import matplotlib.pyplot as plt 
import pydot 
import os
import seaborn as sns

df1 = pd.read_csv("LiveSeg.csv")


sexgroup = df.groupby('Gender')
Female = df[(df['Gender'] == 'FEMALE')]
plt.hist(Female.AcctAge_Months.dropna(),bins =50)

这给了我以下输出: enter image description here

我如何通过年龄组中客户的百分比来显示这些条形图?我正在使用python 3.4.4谢谢

1 个答案:

答案 0 :(得分:1)

您需要从matplotlib返回并保存直方图,以便能够以不同方式为每个条形图着色。

首先,您的代码

sexgroup = df.groupby('Gender')
female = df[(df['Gender'] == 'FEMALE')]

对我来说没有意义,要么只是使用

female = df[(df['Gender'] == 'FEMALE')]

或使用更可读的熊猫方式

female = df.groupby('Gender').get_group('FEMALE')

绘图时,只需保存histgram调用的返回值:

counts, edges, patches = plt.hist(Female.AcctAge_Months.dropna(), bins = 50)

plt.hist的返回是一个包含计数,直方图边缘和显示的matplotlib patch对象列表的元组。现在单独为每个条形图着色,只需调用:

patches[0].set_color('r')

我假设你想要一个特定的颜色,红色,黄色,绿色的百分比,取决于一些百分比。因此,不是传递给'r'的{​​{1}}参数,而是传递一个带有RGB值的元组,如下所示:

set_color

从您的问题来看,目前尚不清楚如何计算“年龄组中客户的百分比”,因为目前还不清楚DataFrame列color = (0.5,0.25,0.25) patches[0].set_color(color) 是什么。我假设你只是将每个DataFrame组的数量除以它的大小,例如来自AcctAge_Months

基本上,只需循环遍历直方图的每个色块并将颜色设置为RGB,而每个颜色分量的百分比必须根据“年龄组中的客户百分比”计算。