Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 使用matplotlib打印格式为DD HH:MM:SS的时间增量轴_Datetime_Matplotlib_Timedelta_Axis Labels - Fatal编程技术网

Datetime 使用matplotlib打印格式为DD HH:MM:SS的时间增量轴

Datetime 使用matplotlib打印格式为DD HH:MM:SS的时间增量轴,datetime,matplotlib,timedelta,axis-labels,Datetime,Matplotlib,Timedelta,Axis Labels,我正在使用Matplotlib绘制赛车赛事的速度/距离数据,例如距离与时间,时间为水平轴,距离为垂直轴 我的输入是两个向量,一个包含事件开始时的时间值(以秒为单位),另一个包含到目前为止行驶的距离。在同一个情节中可能有许多运动员,所以我可以比较他们 问题是,如果我绘制纯时间,我会得到以秒为单位的X轴,这是不自然的: 我可以根据一天中的实际日期和时间绘制数据,并得到可读的结果,但这是绝对时间,而不是事件开始后经过的时间。这一次大约在上午6:00开始: 我想要的是一种以HMS格式获取经过时间的方法,

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

我的输入是两个向量,一个包含事件开始时的时间值(以秒为单位),另一个包含到目前为止行驶的距离。在同一个情节中可能有许多运动员,所以我可以比较他们

问题是,如果我绘制纯时间,我会得到以秒为单位的X轴,这是不自然的:

我可以根据一天中的实际日期和时间绘制数据,并得到可读的结果,但这是绝对时间,而不是事件开始后经过的时间。这一次大约在上午6:00开始:

我想要的是一种以HMS格式获取经过时间的方法,与第二个图形相同,但与事件开始相关的时间,以及缩放级别切换到小时:分钟,然后在缩放级别更改时切换到天:小时,以免标签与缩放无关的数据过于接近


谢谢你的帮助

我认为最简单的方法是编写自己的格式化程序,将其转换为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对象中,或者将它们作为参数


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

我认为最简单的方法是编写自己的格式化程序,将刻度转换为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对象中,或者将它们作为参数


与MultipleLocator相结合,您可以很好地控制滴答声的位置。

我发现了以下几点,这就是我正在使用的。仍然不完美不使用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))

我发现了以下,这就是我正在使用的。仍然不完美不使用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))

最后我做了这件事,我要加上我自己的答案以备将来参考。谢谢最后我做了这件事,我要加上我自己的答案以备将来参考。谢谢