利用Python实现pandas结构数据中所有指定特征相关响应变量的百分比堆积柱状图,并标识数字。

利用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')

输出效果如下

在这里插入图片描述

如果需要引用,不必与我联系,如果遇到bug或者有优化的思路欢迎留言。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值