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

如何用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可以快速实现堆叠条形图,步骤如下:

  1. 数据转换:将宽格式的DataFrame转为长格式,让Plotly能识别分组和堆叠项;
  2. 绘制堆叠图:通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:57:51