利用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或者有优化的思路欢迎留言。
### 绘制堆叠百分比柱状图 为了实现堆叠百分比柱状图,可以利用 `pandas` 和 `matplotlib` 的组合功能。下面是一个具体的例子,展示如何使用这两个库完成这一目标。 首先,准备一些必要的导入语句: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt ``` 接着定义数据集计算各部分所占比例: ```python # 创建样本数据框架 data = {'group': ['A', 'B', 'C'], 'var1': [30, 25, 40], 'var2': [17, 32, 8], 'var3': [15, 9, 22]} df = pd.DataFrame(data) # 将变量列转换为比例形式 percentage_df = df[['var1', 'var2', 'var3']].div(df[['var1', 'var2', 'var3']].sum(axis=1), axis=0) ``` 之后设置绘图参数以及实际绘制图表: ```python fig, ax = plt.subplots() bar_width = 0.35 index = np.arange(len(df)) colors = ["r", "g", "b"] for i in range(percentage_df.shape[1]): bottom=np.sum(percentage_df.iloc[:, :i], axis=1).values if i != 0 else None, plt.bar(index, percentage_df.iloc[:, i].values, bar_width, label=f'Var{i+1}', color=colors[i], bottom=bottom) plt.xlabel('Group') plt.ylabel('Percentage (%)') plt.title('Stacked Percentage Bar Chart') plt.xticks(index, df['group']) plt.legend() plt.tight_layout() plt.show() ``` 上述代码片段展示了如何构建一个简单的堆叠百分比条形图[^1]。这里的关键在于先将原始数值转化为相应的百分比值,且在调用 `plt.bar()` 函数时通过调整 `bottom` 参数来累积各个分量的高度,从而形成堆叠效果。 对于更加复杂的场景或者想要应用 Seaborn 风格的话,则可能需要额外处理数据结构以便于适应特定的需求[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值