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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:47:11