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

按id和date分组的duration数据折线图绘制异常求助

折线图x轴数据跳跃异常的解决方法

我有包含id、date、duration、val1字段的表格数据,想要按id和date分组,以duration为横轴、val1(心率)为纵轴绘制折线图。用下面的Matplotlib代码绘制后,发现粉色分组的数据点在x轴出现跳跃,求解决办法。

表格示例

iddatedurationval1
12342020-06-010:00:0084.0
12342020-06-010:00:0186.0

使用的代码

fig, ax = plt.subplots(figsize=(20,8))
for key, grp in df_df_obj_dur.groupby(['id', 'date']):
    ax.plot(grp['duration'], grp['val1'])

ax.set_xticks([])
plt.xlabel('Duration')
plt.ylabel('Heart Rate')
plt.show()

异常情况

粉色分组的折线在x轴上出现不连续的跳跃,没有按照时间顺序连续绘制。


解决方法

问题根源

duration字段目前是字符串类型,Matplotlib绘制时会按字符串的字典序排列数据,而不是实际的时间先后顺序。如果粉色分组的duration字符串排序混乱(比如出现类似"0:10:00"和"0:01:00"的顺序颠倒),就会导致折线跳跃。

具体步骤

  1. 转换duration为时间差类型:
    先把字符串格式的duration转换成pandas的timedelta类型,让程序能识别这是时间数据:

    df_df_obj_dur['duration'] = pd.to_timedelta(df_df_obj_dur['duration'])
    
  2. 用数值型时间数据绘制折线:
    将timedelta转换为总秒数(或其他数值单位)作为横轴,这样能保证数据按时间顺序排列:

    fig, ax = plt.subplots(figsize=(20,8))
    # 遍历每个分组
    for key, grp in df_df_obj_dur.groupby(['id', 'date']):
        # 将时间差转为总秒数,作为x轴数值
        x_data = grp['duration'].dt.total_seconds()
        # 绘制折线并添加标签方便区分
        ax.plot(x_data, grp['val1'], label=f"ID:{key[0]} 日期:{key[1]}")
    
    # 可选:设置x轴刻度为可读的时间格式
    max_seconds = df_df_obj_dur['duration'].dt.total_seconds().max()
    x_ticks = range(0, int(max_seconds)+1, 300)
    ax.set_xticks(x_ticks)
    # 将秒数转回时间格式作为刻度标签
    ax.set_xticklabels([str(pd.to_timedelta(tick, unit='s')) for tick in x_ticks])
    
    plt.xlabel('Duration')
    plt.ylabel('Heart Rate')
    plt.legend()
    plt.show()
    
  3. 额外提示:
    如果不需要显示具体时间,直接用秒数作为x轴标签也可以,这样更简单。核心就是避免用字符串类型作为时间类数据的横轴。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:27:37