求助:基于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
相关产品推荐
相关产品推荐

