如何合并采用相同行分面规则的两个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()
代码说明
- 日期格式统一:将
dm的date列从DD.MM.YYYY转为标准datetime格式,确保与df的日期数据兼容,x轴能正确对齐。 - 分面trace匹配:Plotly Express的分面按分组变量的排序顺序生成,因此
fig和fig2的分面行顺序完全一致,直接通过trace索引对应行号即可。 - 精准添加trace:使用
fig.add_trace(trace, row=row, col=1)将每个散点trace放到对应的分面行,替代原代码中row='all'的错误写法。 - 统一x轴范围:让所有分面的时间轴显示相同的范围,避免不同分面时间轴错位,提升整体可视化一致性。
内容的提问来源于stack exchange,提问作者Wertok M
相关产品推荐
相关产品推荐

