如何修改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
相关产品推荐
相关产品推荐

