基于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
相关产品推荐
相关产品推荐

