Plotly px.Timeline使用facet_row时y轴标记未自适应问题
Plotly Timeline 分面行自适应问题修复方案
问题现象
使用Plotly Express生成时间线图表时,设置facet_row="Project Key"后出现以下不符合预期的情况:
- 每个分面行的y轴显示了全部
Initiative条目,而非仅对应当前Project Key的内容 - 各分面行高度固定,未根据对应组的
Initiative数量比例自动调整,仅数据条显示对应分组内容
原实现代码:
fig = px.timeline(df, x_start="Target Date Start", x_end="Target Date End", y="Initiative", color="Status Bin", facet_row="Project Key", template="plotly_white")
修复方案(基于r-beginners的建议)
1. 为分组创建独立的y轴分类标签
Plotly Express的分面默认共享全局y轴分类,因此需要为每个Project Key的Initiative生成唯一标签,避免跨分面混排:
# 为每个Project Key的Initiative添加分组标识,生成唯一标签 df['Initiative_Grouped'] = df.apply(lambda row: f"{row['Initiative']} - {row['Project Key']}", axis=1)
2. 生成图表并调整分面布局
使用新的分组标签作为y轴参数,再根据分组条目数量调整分面行高度:
# 基于分组后的标签生成时间线图表 fig = px.timeline(df, x_start="Target Date Start", x_end="Target Date End", y="Initiative_Grouped", color="Status Bin", facet_row="Project Key", template="plotly_white") # 计算每个Project Key的Initiative数量,确定分面行高度比例 group_counts = df['Project Key'].value_counts().sort_index() total_items = group_counts.sum() height_ratios = [count / total_items for count in group_counts] # 更新布局,设置自适应高度比例与y轴显示优化 fig.update_layout( height=700, # 可根据需求调整基础总高度 facet_row_spacing=0.03, yaxis={'categoryorder': 'total ascending'} # 保持y轴条目顺序与分组逻辑一致 ) # 隐藏分面内的重复y轴标题,仅保留左侧主标题 for idx, _ in enumerate(group_counts.index): fig.update_yaxes(title_text='', row=idx+1) fig.update_yaxes(title_text='Initiative', row=1)
核心逻辑说明
- 通过为每个
Initiative添加所属Project Key后缀,让各分面y轴仅显示本组的唯一标签 - 基于分组条目数量计算高度比例,实现分面行高度随内容多少自适应
- 优化y轴标题显示,避免重复冗余,提升图表可读性
内容的提问来源于stack exchange,提问作者Mth Clv
相关产品推荐
相关产品推荐

