如何用含50+ dummy变量的DataFrame绘制筛除零值的百分比堆叠柱状图
需求实现最优思路
1 数据预处理(核心步骤)
所有绘图库默认都是按传入的全量数据渲染,所以不需要找库的内置参数,直接在数据层提前过滤0值即可,逻辑如下:
- 把原宽表转为长表,过滤掉计数为0的dummy变量记录
- 按月份分组计算每个非0变量的当月占比
示例代码:
import pandas as pd # 宽表转长表 df_long = df.melt(id_vars='date', var_name='dummy_var', value_name='count') # 过滤当月取值为0的变量 df_long = df_long[df_long['count'] > 0] # 计算每月总计数 df_long['month_total'] = df_long.groupby('date')['count'].transform('sum') # 计算单变量月度占比 df_long['percentage'] = df_long['count'] / df_long['month_total'] * 100
2 绘图实现
推荐方案:Plotly交互图
适合需要查看明细的场景,自动只堆叠每个月的非0变量:
import plotly.express as px # 定义统一的颜色映射,避免同一变量不同月份颜色不一致 # 可根据自己的变量数量自定义 color_map = {f'dummy_var{i}': px.colors.qualitative.Plotly[i%10] for i in range(1, 51)} fig = px.bar( df_long, x='date', y='percentage', color='dummy_var', color_discrete_map=color_map, title='月度项目构成百分比堆叠图', labels={'percentage':'占比(%)', 'date':'月份', 'dummy_var':'项目类型'}, text='percentage' ) # 设置堆叠模式 fig.update_layout(barmode='stack') # 格式化占比显示 fig.update_traces(texttemplate='%{text:.1f}%', textposition='inside') fig.show()
备选方案:Seaborn静态图
适合需要导出为图片的场景:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) sns.histplot( data=df_long, x='date', weights='percentage', hue='dummy_var', multiple='stack', shrink=0.8, palette=color_map ) plt.title('月度项目构成百分比堆叠图') plt.ylabel('占比(%)') plt.xlabel('月份') plt.xticks(rotation=45) plt.tight_layout() plt.show()
3 可选优化
如果部分变量占比过小显示杂乱,可在预处理阶段新增过滤逻辑,比如只保留占比大于1%的变量。
内容的提问来源于stack exchange,提问作者titu84hh
相关产品推荐
相关产品推荐

