You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:06:03