如何用Plotly绘制按列分类的两类分段条形图
问题描述
我有如下结构的DataFrame:
components Servers Paths Endpoints Security Info non-breaking-count 3455 123 989 134 432 breaking count 234 324 535 255 487
Info列之后还有约30个列。我需要绘制两个分段(堆叠)条形图,分别对应non-breaking-count和breaking count,每个条形按不同列(如Servers、Paths等)用不同颜色切片。优先使用Plotly实现,其他合适库的方案也可接受。预期效果为:每个组件类型对应一个堆叠条形,条形的每个颜色切片对应DataFrame中的一列,x轴为组件类型,y轴为对应数值总和。
解决方案
Plotly 实现方案
Plotly可以快速实现堆叠条形图,步骤如下:
- 数据转换:将宽格式的DataFrame转为长格式,让Plotly能识别分组和堆叠项;
- 绘制堆叠图:通过
barmode='stack'参数开启堆叠模式,指定x轴为组件类型,y轴为数值,颜色对应原DataFrame的列名。
示例代码:
import plotly.express as px import pandas as pd # 替换为你的真实DataFrame data = { "components": ["non-breaking-count", "breaking count"], "Servers": [3455, 234], "Paths": [123, 324], "Endpoints": [989, 535], "Security": [134, 255], "Info": [432, 487] # 补充剩余30列数据 } df = pd.DataFrame(data).set_index("components").reset_index() # 转换为长格式 df_long = df.melt(id_vars="components", var_name="类别", value_name="计数") # 生成堆叠条形图 fig = px.bar( df_long, x="components", y="计数", color="类别", barmode="stack", title="Breaking与Non-Breaking计数对比(按类别)" ) # 自定义布局(可选) fig.update_layout( xaxis_title="组件类型", yaxis_title="总计数", legend_title="类别" ) fig.show()
运行后会生成交互式堆叠条形图,鼠标悬停可查看每个切片的具体数值,适配30+列的场景。
Matplotlib 备选方案
如果偏好Matplotlib,也可以实现相同效果:
示例代码:
import matplotlib.pyplot as plt import pandas as pd # 替换为你的真实DataFrame data = { "components": ["non-breaking-count", "breaking count"], "Servers": [3455, 234], "Paths": [123, 324], "Endpoints": [989, 535], "Security": [134, 255], "Info": [432, 487] } df = pd.DataFrame(data).set_index("components") categories = df.columns components = df.index bottom = [0, 0] # 初始化堆叠底部位置 fig, ax = plt.subplots(figsize=(10, 6)) for cat in categories: ax.bar(components, df[cat], bottom=bottom, label=cat) bottom += df[cat].values # 更新底部位置,实现堆叠 # 设置图表属性 ax.set_xlabel("组件类型") ax.set_ylabel("计数") ax.set_title("Breaking与Non-Breaking计数对比(按类别)") ax.legend(title="类别", bbox_to_anchor=(1.05, 1), loc="upper left") plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Irene Hawkins
相关产品推荐
相关产品推荐

