如何基于现有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
相关产品推荐
相关产品推荐

