如何用Python 3.7及Pandas可视化带时间维度的事件序列?
嘿,这个场景太典型了——跟踪这类时序事件链的可视化需求,用Python+Pandas完全能搞定!我给你准备了两种实用方案,一个是交互式的(方便探索数据),一个是静态的(适合嵌入报告),都能清晰展示你的事件序列逻辑。
第一步:准备并预处理数据
首先我们先构造符合你飞机起降场景的示例数据,同时把时间列转成Pandas能处理的datetime类型,这是可视化的关键前提:
import pandas as pd # 构造示例数据(匹配你的飞机起降场景) data = { "事件描述": ["伦敦起飞", "巴黎降落", "巴黎起飞", "纽约降落", "纽约起飞", "东京降落"], "事件时间": ["2020-10-01 10:00:00", "2020-10-01 15:00:00", "2020-10-01 17:00:00", "2020-10-02 08:00:00", "2020-10-02 12:00:00", "2020-10-03 09:00:00"], "关联航班": ["AA123", "AA123", "AA123", "AA123", "AA123", "AA123"] } df = pd.DataFrame(data) # 转换时间列为datetime类型 df["事件时间"] = pd.to_datetime(df["事件时间"]) # 添加事件序号,方便后续按序列连线 df["事件序号"] = df.index + 1
方案一:交互式时间线(Plotly)
如果你需要能交互探索的图表(比如放大缩小、hover看详情、隐藏特定事件),用Plotly最合适。先安装依赖:pip install plotly,然后运行以下代码:
import plotly.express as px import plotly.graph_objects as go # 用散点图标记每个事件,不同事件用不同颜色区分 fig = px.scatter(df, x="事件时间", y="关联航班", color="事件描述", text="事件描述", title="航班AA123事件序列时间线") # 添加灰色连线,把事件按顺序串联起来,清晰展示事件链 fig.add_trace(go.Scatter( x=df["事件时间"], y=df["关联航班"], mode="lines", line=dict(color="gray", width=2), showlegend=False # 不显示连线的图例 )) # 调整布局,让事件标签显示在点的上方,hover时统一显示时间点的所有信息 fig.update_traces(textposition="top center") fig.update_layout(xaxis_title="时间", yaxis_title="航班号", hovermode="x unified") # 打开交互式图表(会在浏览器里显示) fig.show()
这个图表的优势是互动性强,如果你有多个航班的事件,只需要在关联航班列里区分,y轴会自动生成不同的类别,非常方便多实体跟踪。
方案二:静态时间线(Matplotlib)
如果需要静态图表用于报告、PPT等场景,Matplotlib是最稳妥的选择。代码如下:
import matplotlib.pyplot as plt import matplotlib.dates as mdates # 设置画布大小,适配时间轴的标签 fig, ax = plt.subplots(figsize=(12, 4)) # 将datetime类型转换为Matplotlib能识别的数值格式 df["时间数值"] = mdates.date2num(df["事件时间"]) # 绘制事件点,设置较大的点和蓝色,突出显示 ax.scatter(df["时间数值"], df["关联航班"], s=100, c="blue", zorder=5) # 绘制灰色连线,串联事件序列 ax.plot(df["时间数值"], df["关联航班"], color="gray", linestyle="-", linewidth=2) # 给每个事件点添加文字标签,显示事件描述 for idx, row in df.iterrows(): ax.text(row["时间数值"], row["关联航班"], row["事件描述"], ha="center", va="bottom", fontsize=10) # 设置时间轴的显示格式,避免标签拥挤 ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d %H:%M")) plt.xticks(rotation=45) # 添加标题和轴标签 ax.set_title("航班AA123事件序列时间线", fontsize=14) ax.set_xlabel("时间", fontsize=12) ax.set_ylabel("航班号", fontsize=12) # 调整布局,防止标签被截断 plt.tight_layout() plt.show()
你可以根据需求自定义颜色、点大小、标签样式等,完全适配你的报告风格。
内容的提问来源于stack exchange,提问作者Lion Nadej Ahmed
相关产品推荐
相关产品推荐

