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

基于Python+Pandas+Matplotlib绘制时间戳对应事件图的实现问题

Python事件时序图需求实现方案

核心前置调整

你原有代码将时间列转为了字符串格式,导致x轴为分类轴无法按时间间隔生成刻度,首先要删除将mydate转为字符串的逻辑,保留datetime类型。

完整修改后代码

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
# 实现悬停提示需要先安装依赖:pip install mplcursors
import mplcursors

# 数据读取逻辑保留原有规则
df1 = pd.read_csv('joined_results.txt', delim_whitespace=True, usecols=[0,1,2], names = ["Day", "Time", "Event"])
# 合并日期+时间生成完整datetime时间戳,避免仅用时间出现的跨天识别异常
df1['mydate'] = pd.to_datetime(df1["Day"] + " " + df1["Time"], infer_datetime_format=True)
# 清理事件字段的分号
df1["Event"] = df1["Event"].str.replace(";", "")
# 将事件映射为数值方便y轴展示,可根据需求自行调整映射规则
event_map = {"entry": 1, "exit": 0}
df1["y_val"] = df1["Event"].map(event_map)

# 初始化画布
fig, axes = plt.subplots(1, 1, figsize=(16, 6))
# 绘制散点,记录散点对象用于后续绑定悬停事件
scatter = axes.scatter(df1["mydate"], df1["y_val"], c=df1["y_val"], cmap="coolwarm", s=50)

# -------------------------- 需求1:x轴30分钟间隔刻度实现 --------------------------
# 设置x轴主刻度间隔为30分钟
axes.xaxis.set_major_locator(mdates.MinuteLocator(interval=30))
# 设置x轴刻度显示格式
axes.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
# 自动旋转刻度避免重叠
plt.setp(axes.get_xticklabels(), rotation=45, ha="right")
# 固定x轴范围为12小时,可根据实际数据时间范围调整
x_min = df1["mydate"].min().floor("H")
x_max = x_min + pd.Timedelta(hours=12)
axes.set_xlim(x_min, x_max)

# -------------------------- 需求2:鼠标悬停显示精确时间 --------------------------
cursor = mplcursors.cursor(scatter, hover=True)
@cursor.connect("add")
def on_add(sel):
    # 获取选中点对应的数据索引
    idx = sel.index
    # 读取对应行的完整时间和事件类型
    timestamp = df1.iloc[idx]["mydate"].strftime("%Y-%m-%d %H:%M:%S")
    event = df1.iloc[idx]["Event"]
    # 自定义悬停提示内容和样式
    sel.annotation.set_text(f"时间:{timestamp}\n事件:{event}")
    sel.annotation.get_bbox_patch().set(fc="white", alpha=0.9)

# 其余绘图配置
axes.set_yticks([0, 1])
axes.set_yticklabels(["exit", "entry"])
axes.set_title("Event Plot")
axes.set_xlabel("时间")
axes.set_ylabel("事件类型")
plt.subplots_adjust(bottom=0.2)
plt.margins(y=0.2)
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.show()

修改说明

  • 保留datetime类型的时间列,让matplotlib识别为连续时间轴,才能按时间间隔生成规则刻度
  • 用matplotlib.dates的MinuteLocator直接设置30分钟的刻度间隔,配合DateFormatter自定义刻度显示格式,12小时刚好生成24个刻度
  • 用mplcursors绑定散点的悬停事件,悬停时自动读取对应行的完整时间和事件类型展示
  • 新增了事件类型到y轴数值的映射,让时序图展示更清晰,可根据自身需求调整y轴的显示逻辑

内容的提问来源于stack exchange,提问作者Moustafa Abdelsalam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:57:03