3

我正在使用 Matplotlib 绘制来自赛车事件的速度/距离数据,例如距离与时间,时间是水平轴,距离是垂直轴。

我的输入是两个向量,一个包含“距离事件开始的秒数”的时间值,另一个包含“到目前为止的距离”。同一个情节可以有很多运动员,所以我可以比较一下。

问题是,如果我绘制纯时间,我会以秒数获得 X 轴,这不自然地阅读:

在此处输入图像描述

我可以根据一天中的实际日期和时间绘制数据,并且我得到可读的结果,但这是绝对时间,而不是自事件开始以来经过的时间(这个开始于上午 6:00 左右):

在此处输入图像描述

我想要的是一种以 HMS 格式获取经过时间的方法(与第二个图形相同,但时间与事件开始相关),并且可能具有缩放级别的“意识”(切换到小时:分钟,然后到天:缩放级别更改的小时数,以免标签与与比例无关的数据过于靠近)。

谢谢你的帮助!

4

2 回答 2

3

我怀疑最简单的方法是编写自己的Formatterdoc)来转换为 HMS。

import matplotlib

class myFormatter(matplotlib.ticker.Formatter):
    def __call__(self,in_value_in_seconds,pos=None):
        hours = int(in_value_in_seconds//(3600))
        in_value_in_seconds -= hours * 3600
        mins = int(in_value_in_seconds//(60))
        in_value_in_seconds -= mins * 60
        secs = int(in_value_in_seconds)

        return str(hours) + ":" + str(mins) + ":" + str(secs)

这是(我认为)最简单的情况,不支持任何缩放。将其中一些逻辑推入一个datetime.deltatime对象(或将它们作为参数)可能会更好。

结合MultipleLocatordoc),您可以很好地控制刻度线的位置。

于 2012-09-25T16:10:45.523 回答
1

我想出了以下内容,这就是我正在使用的。仍然不完美(不使用 60 的倍数作为主要刻度),但格式本身就是我想要的:

def HMS(seconds, pos):
    seconds = int(seconds)
    hours = seconds / 3600
    seconds -= 3600 * hours
    minutes = seconds / 60
    seconds -= 60 * minutes
    if hours == 0:
        if minutes == 0:
            return "%ds" % (seconds)
        return "%dm%02ds" % (minutes, seconds)
    return "%dh%02dm" % (hours, minutes)

ax = plt.gca()
ax.xaxis.set_major_formatter(plt.FuncFormatter(HMS))
于 2012-09-25T16:22:50.577 回答