利用Python实现pandas结构数据中所有指定特征关联响应变量的百分比堆积柱状图,并标识数字。
首先一个较大的隐患是,代码中主要采用for循环,对运算效率存在影响,目前暂不调整。
意义:
对与日常办公需要绘制相关图形的场景,提供更强的灵活和便利,可用作初步的数据分析和关键指标的判断。一次性生成想要的指标对应的堆积柱状图,样例如下,如要生成其它图形,做出相应调整即可。
导入相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
#选择一种图形风格,是可视化效果更美观
plt.style.use('fivethirtyeight')
plt.rcParams['font.sans-serif'] = ['SimHei']
完整代码(可以直接调用)
def getColor():
colorStr='1379ABCD'
color='#'+''.join(np.random.choice(list(colorStr),6))
return color
def biliduiji(data,list_,canzhao):
for each in list_:
#画布
figure,axes=plt.subplots(1,1,figsize=(8,data[each].unique().shape[0]*0.2))
#组合
tmp=data.groupby(each)[canzhao].value_counts().unstack(canzhao)
tmp['total']=tmp.sum(axis=1)
tmp.sort_values(by='total',inplace=True)
tmp=tmp.drop('total',axis=1)
#归一
b=tmp.div(tmp.sum(1).astype('float'),axis=0)
b=b.round(2)
b=b.fillna(0)
#作图
b.plot(kind='barh',stacked=True,ax=axes,width=0.7,color=[getColor() for i in range(data[canzhao].unique().shape[0])])
plt.yticks(fontsize=10)
plt.legend(loc='lower right')
#数据
for col in b:
for y,x in enumerate(b[col].values):
if x!=0:
plt.text(x*0.5+sum(b.iloc[y][:b.columns.tolist().index(col)]),y-0.1,x,fontsize=10)
plt.title(f'{each} for each company',fontsize=14)
plt.savefig(f'./tmp_pic/{each} for {canzhao}.jpg',bbox_inches='tight')
输出效果
biliduiji(data,['货运方式'],'收件公司')
由此可以直观的观察各种物流方式对应的收件公司的选取情况。
data为自己的数据集,list_为需要调用作图的特征变量的列表(我这里只画了一张图),canzhao为参照变量,一般选取类别数量介绍的类别变量。
另外分享一个数量的堆积柱状图,结合前一种图形可以更直观的对比。
def leibieduiji(data,list_,canzhao):
for each in list_:
figure,axes=plt.subplots(1,1,figsize=(8,data[each].unique().shape[0]*0.2))
tmp=data.groupby(each)[canzhao].value_counts().unstack(canzhao)
tmp['total']=tmp.sum(axis=1)
tmp.sort_values(by='total',inplace=True)
tmp.drop('total',axis=1).plot(kind='barh',stacked=True,ax=axes)
plt.yticks(fontsize=10)
plt.legend(loc='right')
for y, x in enumerate(tmp.total.values):
plt.text(x+3, y, "%s" %x,fontsize=10)
plt.title(f'{each} for each company',fontsize=14)
plt.savefig(f'./tmp_pic/{list2.index(each)} for company.jpg',bbox_inches='tight')