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

如何用Plotly/Python制作交替分段堆叠条形图(非日期X轴)

实现Plotly/Python交替分段的浮点数X轴堆叠条形图

问题说明

我想用Plotly/Python制作包含两类交替分段的堆叠条形图。最初使用graph_objects的stacked模式时,同类型分段会被自动归为一组(如我的场景中所有Resource A段呈AABB排列),但我需要ABAB的交替排列。尝试用Plotly Express的timeline函数做出了接近预期的效果,但该函数仅支持日期型X轴,我需要保留一位小数的浮点数X轴,请问如何实现?

原参考示例(使用日期轴,仅作效果参考):

import pandas as pd
import plotly.express as px

df = pd.DataFrame([
    dict(Task="", Start='2009-01-01', Finish='2009-02-28', Resource='A'),
    dict(Task="", Start='2009-02-28', Finish='2009-04-15', Resource='B'),
    dict(Task="", Start='2009-04-15', Finish='2009-05-30', Resource='A'),
    dict(Task="", Start='2009-05-30', Finish='2009-06-15', Resource='B'),
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color = "Resource")
fig.show()

解决方案:手动构建Graph Objects条形图

直接使用plotly.graph_objects.Bar,通过设置每个分段的起始位置(base)和宽度(x),实现浮点数X轴的交替分段效果,无需依赖日期类型。

完整代码示例

import pandas as pd
import plotly.graph_objects as go

# 构造浮点数数据的DataFrame
df = pd.DataFrame([
    dict(Task="", Start=0.0, Finish=1.5, Resource='A'),
    dict(Task="", Start=1.5, Finish=3.2, Resource='B'),
    dict(Task="", Start=3.2, Finish=4.7, Resource='A'),
    dict(Task="", Start=4.7, Finish=5.3, Resource='B'),
])

fig = go.Figure()

# 遍历数据,逐个添加分段条形
for idx, row in df.iterrows():
    fig.add_trace(go.Bar(
        y=[row['Task']],  # 固定y轴值,确保所有分段在同一行
        x=[row['Finish'] - row['Start']],  # 条形宽度为结束值减起始值
        base=[row['Start']],  # 设置条形的起始位置
        marker_color='#1f77b4' if row['Resource'] == 'A' else '#ff7f0e',  # 对应资源的颜色
        name=row['Resource'],
        showlegend=(idx == 0 or idx == 1)  # 仅在首次出现时显示图例,避免重复
    ))

# 配置图表布局
fig.update_layout(
    barmode='overlay',  # 使用叠加模式,配合base参数精准控制位置
    xaxis=dict(
        tickformat='.1f',  # 设置X轴显示一位小数
        title='数值轴'
    ),
    yaxis=dict(
        showticklabels=False  # 隐藏y轴标签,因Task字段为空
    ),
    title='交替分段的浮点数X轴条形图'
)

fig.show()

关键说明

  • 放弃stacked模式,改用overlay模式,每个分段作为独立的Bar trace,通过base参数指定起始位置,x参数指定宽度,完全控制每个分段的位置,实现ABAB交替排列。
  • 通过tickformat='.1f'强制X轴显示一位小数,满足浮点数格式需求。
  • 手动设置资源对应的颜色,并控制图例仅显示一次,保持图表简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:55:28