如何使用Plotly Express在单张图中绘制来自两个DataFrame的多条时间线(甘特图)
如何用Plotly Express将多个DataFrame的时间线(甘特图)合并到同一张图中
你遇到的问题很典型——直接两次调用px.timeline()没办法把两个DataFrame的时间线叠加到同一张图里,因为每次调用px.timeline()都会生成一个全新的Figure对象,而不是在已有图上追加内容。不过用Plotly Express实现需求其实很简单,下面给你两种可行的方案:
方法一:合并DataFrame后绘制(推荐)
这是最贴合Plotly Express设计理念的方式,通过给不同数据集添加区分标识,一次性生成合并后的时间线:
- 给每个DataFrame新增一个分类列,用来标记不同的任务类型(比如你代码里的"Towing"和"Hook-Up")
- 合并两个DataFrame为一个统一的数据集
- 用合并后的DataFrame调用
px.timeline(),通过color参数自动区分不同类别
示例代码:
import plotly.express as px import pandas as pd # 给两个DataFrame添加分类标识 chosen_data3["Task Type"] = "Towing" chosen_data4["Task Type"] = "Hook-Up" # 合并成一个DataFrame combined_df = pd.concat([chosen_data3, chosen_data4], ignore_index=True) # 绘制合并后的时间线 fig = px.timeline( combined_df, x_start="Start Date", x_end="End Date", y="new", color="Task Type", # 用分类列区分颜色 hover_data=["Duration [Hours]", "Hs [m]"] # 自定义悬停显示的字段 ) # 可以根据需求调整布局,比如反转y轴顺序 fig.update_yaxes(autorange="reversed") fig.show()
这种方式不仅能把所有时间线整合到一张图里,还能自动生成图例、区分颜色,悬停时也能展示你需要的所有字段,比用graph_objs循环添加Trace的写法简洁得多。
方法二:手动叠加Plotly Express的Trace
如果你不想合并DataFrame,也可以分别生成两个时间线的Figure,然后把第二个Figure的Trace手动添加到第一个里面:
import plotly.express as px # 生成第一个数据集的时间线 fig = px.timeline(chosen_data3, x_start="Start Date", x_end="End Date", y="new", color_discrete_sequence=["#000000"]) # 生成第二个数据集的时间线 fig2 = px.timeline(chosen_data4, x_start="Start Date", x_end="End Date", y="new", color_discrete_sequence=["#4169E1"]) # 将fig2的所有Trace添加到fig中 for trace in fig2.data: trace.name = "Hook-Up" # 手动设置图例名称 fig.add_trace(trace) # 调整图例和布局 fig.update_layout(legend_title_text="Task Type") fig.show()
不过这种方法需要手动处理颜色、图例名称等细节,不如第一种方法优雅,只适合特殊场景下使用。
为什么你之前的尝试无效?
你写的fig2 = px.timeline(..., ax = fig)是错误的——ax是Matplotlib的参数,Plotly Express并不支持。每次调用px.timeline()都会创建一个独立的Figure,所以第二次调用的结果只会生成新图,不会叠加到第一个图上。
内容的提问来源于stack exchange,提问作者Keyser Soze
相关产品推荐
相关产品推荐

