【问题标题】:Plot axis of timedeltas formatted as DD HH:MM:SS with matplotlib使用 matplotlib 绘制格式为 DD HH:MM:SS 的时间增量轴
【发布时间】:2012-09-11 23:54:00
【问题描述】:

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

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

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: datetime matplotlib timedelta axis-labels


    【解决方案1】:

    我怀疑最简单的方法是编写自己的 Formatter (doc) 来转换为 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 (doc),您可以很好地控制刻度线的位置。

    【讨论】:

    • 我最终这样做了,将添加我自己的答案以供将来参考。谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 2014-12-26
      • 1970-01-01
      • 2017-12-21
      • 2016-12-02
      • 2019-04-17
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      相关资源
      最近更新 更多