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

如何基于现有DataFrame结构用Plotly绘制非堆叠柱状图?

最优实现方案

核心思路是先把当前的宽格式DataFrame转为长格式(Tidy 数据),这是适配Plotly绘图框架最通用的方案,逻辑清晰且便于后续维度扩展。

步骤1:数据预处理

首先清洗销售额字段的$符号,再将宽表转换为每一行对应「月份-年份-销售额」的长表结构:

import pandas as pd
import plotly.express as px

# 处理销售额字段:去除$符号转为数值类型
df["Shoes__sale_x"] = df["Shoes__sale_x"].str.replace("$", "", regex=False).astype(float)
df["Shoes__sale_y"] = df["Shoes__sale_y"].str.replace("$", "", regex=False).astype(float)

# 宽表转长表
df_long = pd.melt(
    df,
    id_vars="Date",
    value_vars=["Shoes__sale_x", "Shoes__sale_y"],
    value_name="sales"
)
# 匹配对应年份
df_long["year"] = df_long["variable"].map({
    "Shoes__sale_x": "2020",
    "Shoes__sale_y": "2021"
})

步骤2:绘制非堆叠(分组)柱状图

直接调用Plotly Express的柱状图接口,指定分组模式即可实现你要的效果:

fig = px.bar(
    df_long,
    x="Date",
    y="sales",
    color="year", # 按年份区分柱子颜色,图例自动展示2020/2021分类
    barmode="group", # 分组模式即非堆叠效果
    labels={"sales": "鞋子销售额", "Date": "月份", "year": "年份"},
    title="2020-2021年鞋子月度销售额对比"
)
fig.show()

如果后续需要新增其他年份的对比数据,只需要在原宽表中加对应列,修改melt和map的配置即可,不需要额外调整绘图逻辑,扩展性远高于手动添加多个Trace的写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:06:00