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

如何合并采用相同行分面规则的两个Plotly Express图表?

解决Plotly合并同规则行分面的时间线与散点图问题

你的代码存在两个核心问题:一是两个数据集日期格式不统一,导致散点的x轴数据和时间线无法兼容;二是仅添加了散点图的第一个trace,其余分面的散点未被纳入,且未对应到正确的分面行。

以下是修正后的实现思路与代码:

关键处理步骤

  • 统一两个DataFrame的日期格式,全部转为datetime类型,确保x轴数据逻辑一致
  • 遍历散点图的每个trace,根据分面的国家对应添加到时间线图的对应行
  • 统一所有分面的x轴范围,避免不同分面时间轴错位(可选,提升可视化一致性)

完整代码

import plotly.express as px
import pandas as pd

# 时间线数据
df = pd.DataFrame([
    dict(team='Wolfs', start='2004-05-23', end='2006-05-24', country='Russia'),
    dict(team='Lions', start='2007-07-05', end='2009-07-06', country='USA'),
    dict(team='Crows', start='2001-08-09', end='2003-08-11', country='USA'),
    dict(team='Elephants', start='2010-02-14', end='2012-02-15', country='China')
])
# 转换日期格式为datetime
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

# 散点事件数据
dm = pd.DataFrame([
    dict(date='23.05.2004', team='Wolfs', country='Russia'),
    dict(date='04.07.2007', team='Lions', country='USA'),
    dict(date='09.08.2001', team='Crows', country='USA'),
    dict(date='14.02.2010', team='Elephants', country='China')
])
# 转换散点的日期格式,与时间线统一
dm['date'] = pd.to_datetime(dm['date'], format='%d.%m.%Y')

# 创建时间线图,保留分面配置
fig = px.timeline(df, x_start='start', x_end='end', y='team', facet_row='country')

# 创建散点图,获取每个分面对应的trace
fig2 = px.scatter(dm, x='date', y='team', facet_row='country')

# 遍历散点trace,对应添加到时间线图的分面行
# Plotly分面行号从1开始,且px生成的分面顺序与分组变量排序一致,直接按索引对应
for idx, trace in enumerate(fig2.data):
    fig.add_trace(trace, row=idx+1, col=1)

# 统一所有分面的x轴范围
all_dates = pd.concat([df['start'], df['end'], dm['date']])
min_date, max_date = all_dates.min(), all_dates.max()
for row in range(1, len(fig2.data)+1):
    fig.update_xaxes(range=[min_date, max_date], row=row, col=1)

# 调整布局高度,优化分面显示
fig.update_layout(height=600)

fig.show()

代码说明

  1. 日期格式统一:将dm的date列从DD.MM.YYYY转为标准datetime格式,确保与df的日期数据兼容,x轴能正确对齐。
  2. 分面trace匹配:Plotly Express的分面按分组变量的排序顺序生成,因此fig和fig2的分面行顺序完全一致,直接通过trace索引对应行号即可。
  3. 精准添加trace:使用fig.add_trace(trace, row=row, col=1)将每个散点trace放到对应的分面行,替代原代码中row='all'的错误写法。
  4. 统一x轴范围:让所有分面的时间轴显示相同的范围,避免不同分面时间轴错位,提升整体可视化一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:23:38