【问题标题】:Precision plotting in time axis时间轴上的精确绘图
【发布时间】:2014-05-31 22:52:09
【问题描述】:

我在绘制数据时遇到问题,我只想绘制 HH:MM:SS,但绘图显示 HH:MM:SS.sssss 或 HH:MM:SS.%f。下面我将详细说明我做了什么(matplotlib、numpy 已经导入)

方法一

加载要绘图的文件

import datetime as dt
data=genfromtxt('27JAN12.K7O', delimiter=2*[4]+5*[2]+8*[7])
f245   = data[:, 7]

生成时间数组(每秒 1 个数据)

base = dt.datetime(2014,1,27,11,07,59)
time  = array([base + dt.timedelta(seconds=i) for i in range(len(data))])
plot(time,f245)

当我这样做时,我得到了这个情节(具有不必要的精确度)

我的时间是 18:15:00.000000(我喜欢 18:15:00)

方法二

同样的方式加载数据,本例中只有我取了数据的时间,并在时间字符串中覆盖

t      =  data[:,1] #in decimals e.g. 18,5 represents 18:30:00
tstr   =  map(str, [dt.timedelta(seconds=x) for x in t])
time = []
for i in tstr:
    try:
        time.append(dt.datetime.strptime(i, "%H:%M:%S"))
    except ValueError:
        time.append(dt.datetime.strptime(i, "%H:%M:%S.%f"))
plot(time,f245)

在这种情况下,我的时间大概是 18:15:00.%f

那么,我该如何修复呢?

【问题讨论】:

    标签: python datetime matplotlib plot


    【解决方案1】:

    您应该使用 plot_date 使用 matplotlib 绘制 datetime 对象。

    您可以使用matplotlib.dates.date2numdatetime 对象转换为matplotlib 格式。

    此外,您可以使用 DateFormatter 对象来设置 x 轴刻度标签的格式。

    我现在已经包含了一个使用生成数据的小示例,希望这可以为您解释一切。

    import numpy as numpy
    
    import matplotlib.pyplot as plt
    from matplotlib.dates import date2num, DateFormatter
    
    import datetime as dt
    
    base = dt.datetime(2014, 1, 27, 11, 7, 59)
    
    x = [base + dt.timedelta(seconds=i) for i in range(10)]
    y = [i**2 for i in range(10)]
    
    x = date2num(x) # Convert datetime objects to the correct format for matplotlib.
    
    fig, ax = plt.subplots()
    
    ax.plot_date(x, y) # Use plot_date rather than plot
    
    # Set the xaxis major formatter as a DateFormatter object
    # The string argument shows what format you want (HH:MM:SS)
    ax.xaxis.set_major_formatter(DateFormatter('%H:%M:%S'))
    
    # This simply makes them look pretty by setting them diagonal.
    fig.autofmt_xdate()
    
    plt.show()
    

    【讨论】:

    • 为了建立 x 限制,我可以执行 "xlim(dt.datetime(2014, 01, 27,18,00),dt.datetime(2014, 01, 27,18,30))" ?我这样做了,它有效,但还有其他形式吗?
    猜你喜欢
    • 2020-09-18
    • 2016-06-24
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多