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

如何修改Plotly create_gantt生成的甘特图条形属性并实现进度着色?

解决方案:Plotly甘特图自定义样式与条形属性编辑

核心结论

完全可以编辑ff.create_gantt生成的甘特图条形属性——它返回的是标准Plotly Figure对象,所有条形(对应fig.data中的trace)都支持自定义修改颜色、透明度、阴影等样式。

以下是实现你需求的完整代码及说明:

1. 数据准备(模拟你的样本数据结构)

import pandas as pd
import plotly.figure_factory as ff

# 模拟样本数据(对应你提供的截图结构)
df = pd.DataFrame({
    'Task': ['Task 1', 'Task 2', 'Task 3', 'Task 4'],
    'Team_Name': ['Team A', 'Team B', 'Team A', 'Team C'],
    'Start': ['2024-01-01', '2024-01-05', '2024-01-10', '2024-01-15'],
    'Finish': ['2024-01-15', '2024-01-20', '2024-01-25', '2024-01-30'],
    'Complete %': [75, 50, 90, 30]
})

# 自定义团队颜色映射
color_dict = {'Team A': '#1f77b4', 'Team B': '#ff7f0e', 'Team C': '#2ca02c'}

2. 生成并定制甘特图

# 生成带进度的基础甘特图
fig = ff.create_gantt(
    df,
    index_col='Team_Name',
    colors=color_dict,
    show_colorbar=True,
    showgrid_x=True,
    showgrid_y=False,
    title='Project XYZ Tracker',
    progress='Complete %',  # 启用进度条自动生成
    bar_width=0.4  # 调整条形宽度
)

# 反转y轴(任务从上到下排列)
fig.update_yaxes(autorange='reversed')

# 遍历所有trace,自定义条形样式
for trace in fig.data:
    # 处理进度条(已完成部分)
    if 'progress' in trace.name:
        team = trace.name.split(' ')[0]
        trace.marker.update(
            color=color_dict[team],
            opacity=0.8,  # 设置透明度
            line={
                'width': 1,
                'color': '#333',
                'shadow': {'color': 'rgba(0,0,0,0.3)', 'width': 2, 'offset': 2}  # 阴影效果
            }
        )
    # 处理背景条(未完成部分)
    else:
        trace.marker.update(
            color='rgba(200,200,200,0.3)',
            line={'color': '#666'}
        )

# 给每个任务添加右侧完成百分比文本
for idx, row in df.iterrows():
    # 计算文本位置(条形右侧偏移)
    x_pos = pd.to_datetime(row['Finish']) + pd.Timedelta(days=0.5)
    fig.add_annotation(
        x=x_pos,
        y=idx,
        text=f"{row['Complete %']}%",
        showarrow=False,
        font={'size': 10, 'color': '#333'},
        align='left'
    )

# 调整布局,给右侧文本预留空间
fig.update_layout(
    xaxis={'range': [pd.to_datetime(df['Start'].min()) - pd.Timedelta(days=1), 
                     pd.to_datetime(df['Finish'].max()) + pd.Timedelta(days=3)]},
    margin={'r': 100}
)

fig.show()

3. 条形属性编辑说明

ff.create_gantt生成的每个条形对应fig.data中的一个trace,你可以通过以下方式修改:

  • 单个trace修改:遍历fig.data,针对特定trace(比如进度条、背景条)调整marker.color、marker.opacity、marker.line等属性
  • 批量修改:使用fig.update_traces()对符合条件的trace统一设置样式
  • 新增元素:通过fig.add_annotation()、fig.add_shape()添加文本、图形等额外内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:53:36