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

求助:基于Seaborn绘制按Haul分组的堆叠百分比柱状图

实现按Haul分组的堆叠百分比柱状图(Seaborn)

要实现你需要的堆叠百分比柱状图,核心是先预处理数据计算分组占比,再结合Seaborn+Matplotlib实现堆叠效果——Seaborn本身没有原生的堆叠百分比柱状图函数,所以需要手动处理数据和绘图逻辑。

步骤1:数据预处理

假设你的数据列包含Haul(分组字段)和ServiceRating(评分字段,比如"满意"/"一般"/"不满意"这类分类值),先按Haul分组计算每个评分的占比:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 读取你的数据(替换成你的数据读取逻辑)
df = pd.read_csv("你的数据文件.csv")

# 1. 按Haul和ServiceRating分组计数
count_df = df.groupby(["Haul", "ServiceRating"]).size().reset_index(name="count")

# 2. 计算每个Haul的总计数,再计算百分比
count_df["total"] = count_df.groupby("Haul")["count"].transform("sum")
count_df["percentage"] = (count_df["count"] / count_df["total"]) * 100

# 3. 整理为适合绘图的格式(可选,用于固定分类排序)
ratings = count_df["ServiceRating"].unique()
haul_order = count_df["Haul"].unique()

步骤2:绘制堆叠百分比柱状图

通过循环每个评分类别,逐步绘制堆叠的柱子,手动设置每个柱子的bottom参数来实现堆叠效果:

# 设置绘图风格
sns.set_style("whitegrid")
plt.figure(figsize=(10, 6))

# 初始化底部位置为0
bottom = pd.Series([0]*len(haul_order), index=haul_order)

# 循环每个评分类别,绘制堆叠柱子
for rating in ratings:
    # 筛选当前评分的百分比数据
    subset = count_df[count_df["ServiceRating"] == rating]
    # 绘制柱状图,设置bottom为之前的堆叠高度
    sns.barplot(x="Haul", y="percentage", data=subset, label=rating, bottom=bottom.loc[subset["Haul"]])
    # 更新底部位置
    bottom = bottom.add(subset.set_index("Haul")["percentage"], fill_value=0)

# 设置图表标签和图例
plt.xlabel("Haul")
plt.ylabel("百分比 (%)")
plt.title("按Haul分组的乘客服务评分占比")
plt.legend(title="服务评分")
plt.ylim(0, 100)  # Y轴固定0-100,保证百分比展示准确

plt.show()

关键补充说明

  • 如果你的评分是数值型(比如1-5分),可以先转为分类类型保证排序正确:df["ServiceRating"] = df["ServiceRating"].astype("category")
  • 若需要自定义配色,可在sns.barplot中添加palette参数,比如palette=sns.color_palette("Blues_d", len(ratings))
  • 如果数据来自数据仓库,只需把第一步的pd.read_csv替换为对应的数据读取逻辑(如SQL查询结果转DataFrame)即可

内容的提问来源于stack exchange,提问作者oerkal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:04:59