按id和date分组的duration数据折线图绘制异常求助
折线图x轴数据跳跃异常的解决方法
我有包含id、date、duration、val1字段的表格数据,想要按id和date分组,以duration为横轴、val1(心率)为纵轴绘制折线图。用下面的Matplotlib代码绘制后,发现粉色分组的数据点在x轴出现跳跃,求解决办法。
表格示例
| id | date | duration | val1 |
|---|---|---|---|
| 1234 | 2020-06-01 | 0:00:00 | 84.0 |
| 1234 | 2020-06-01 | 0:00:01 | 86.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"的顺序颠倒),就会导致折线跳跃。
具体步骤
转换duration为时间差类型:
先把字符串格式的duration转换成pandas的timedelta类型,让程序能识别这是时间数据:df_df_obj_dur['duration'] = pd.to_timedelta(df_df_obj_dur['duration'])用数值型时间数据绘制折线:
将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()额外提示:
如果不需要显示具体时间,直接用秒数作为x轴标签也可以,这样更简单。核心就是避免用字符串类型作为时间类数据的横轴。
内容的提问来源于stack exchange,提问作者fid
相关产品推荐
相关产品推荐

