【问题标题】:Matplotlib: Automatically displaying time column as 2 hour ticks on y axis in scatterplotMatplotlib:在散点图中的 y 轴上自动将时间列显示为 2 小时刻度
【发布时间】:2020-09-29 00:14:26
【问题描述】:

我有这些数据:

Time = ['2017-03-13 00:01:00', '2017-03-13 00:02:00', '2017-03-13 23:59:00']
Speed = [20, 40.5, 100]
Kilometer = [1.4, 2.0, 4.1]   
N130317 = pd.DataFrame({'Time':Time, 'Speed':Speed, 'Kilometer':Kilometer})

我已使用以下方法转换时间:

N130317['Time'] = pd.to_datetime(N130317['Time'], format = '%Y-%m-%d %H:%M:%S')
N130317['Time'] = pd.to_datetime(N130317['Time'], format).apply(lambda x: x.time())
N130317['Time'] = N130317['Time'].map(lambda t: t.strftime('%H:%M'))

我已经使用:

marker_size=1 #sets size of dots
cm = plt.cm.get_cmap('plasma_r') #sets colour scheme 
plt.scatter(N130317['Kilometer'], N130317['Time'], marker_size, c=N130317['Speed'], cmap=cm)
plt.title("NDW 13-03-17")
plt.xlabel("Kilometer")
plt.ylabel("Time")
plt.colorbar().set_label("Speed", labelpad=+1) #Makes a legend
plt.show()

但是图表是这样显示的(所有时间戳都显示在 y 轴上,显然没有空间容纳它们 - 我的日期中的每一分钟都有一个时间戳):

我能做些什么来解决这个问题?任何帮助将不胜感激。我在网上尝试了很多东西。

【问题讨论】:

    标签: python pandas datetime matplotlib time


    【解决方案1】:

    我使用这些行创建了一些数据,用您的数据替换它们:

    from itertools import product
    
    Time = [f'2017-03-13 {H}:{M}:{S}' for H, M, S in list(product([('0' + str(x))[-2:] for x in range(0, 24)],
                                                                  [('0' + str(x))[-2:] for x in range(0, 60)],
                                                                  [('0' + str(x))[-2:] for x in range(0, 60)]))]
    Speed = list(130*np.random.rand(len(Time)))
    Kilometer = list(50*np.random.rand(len(Time)))
    N130317 = pd.DataFrame({'Time':Time, 'Speed':Speed, 'Kilometer':Kilometer})
    

    我使用这一行将N130317['Time'] 转换为时间戳:

    N130317['Time'] = pd.to_datetime(N130317['Time'], format = '%Y-%m-%d %H:%M:%S')
    

    然后我将 yaxis 格式属性设置为日期:

    import matplotlib.dates as md
    
    ax=plt.gca()
    xfmt = md.DateFormatter('%H:%M')
    ax.yaxis.set_major_formatter(xfmt)
    

    整个代码是:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.dates as md
    from itertools import product
    
    Time = [f'2017-03-13 {H}:{M}:{S}' for H, M, S in list(product([('0' + str(x))[-2:] for x in range(0, 24)],
                                                                  [('0' + str(x))[-2:] for x in range(0, 60)],
                                                                  [('0' + str(x))[-2:] for x in range(0, 60)]))]
    Speed = list(130*np.random.rand(len(Time)))
    Kilometer = list(50*np.random.rand(len(Time)))
    N130317 = pd.DataFrame({'Time':Time, 'Speed':Speed, 'Kilometer':Kilometer})
    
    N130317['Time'] = pd.to_datetime(N130317['Time'], format = '%Y-%m-%d %H:%M:%S')
    
    marker_size = 1  # sets size of dots
    cm = plt.cm.get_cmap('plasma_r') #sets colour scheme
    plt.scatter(N130317['Kilometer'], N130317['Time'], marker_size, c=N130317['Speed'], cmap=cm)
    ax=plt.gca()
    xfmt = md.DateFormatter('%H:%M')
    ax.yaxis.set_major_formatter(xfmt)
    plt.title("NDW 13-03-17")
    plt.xlabel("Kilometer")
    plt.ylabel("Time")
    plt.colorbar().set_label("Speed", labelpad=+1) #Makes a legend
    plt.show()
    

    它给了我这个情节:


    请注意,pd.to_datetime() 必须应用于 datetime 对象,而不是字符串。如果你运行这段代码:

    hour = '2017-03-13 00:00:00'
    pd.to_datetime(hour, format = '%H:%M')
    

    您将收到以下错误消息:

    ValueError: time data '2017-03-13 00:00:00' does not match format '%H:%M' (match)
    

    所以您需要使用此代码,以便将字符串转换为datetime

    hour = '2017-03-13 00:00:00'
    hour = datetime.strptime(hour, '%Y-%m-%d %H:%M:%S')
    pd.to_datetime(hour, format = '%H:%M')
    

    这取决于您拥有的数据类型,我没有遇到这个问题,因为我按照上面的方法重新创建了数据。

    版本信息

    Python      3.7.0
    matplotlib  3.2.1
    numpy       1.18.4
    pandas      1.0.4
    

    【讨论】:

    • 你是个魔术师。我是否需要其他时间格式行(N130317['Time'] = pd.to_datetime(N130317['Time'], format = '%H:%M') 之前的 3 行)?
    • 不,你不需要:N130317['Time'] = pd.to_datetime(N130317['Time'], format = '%H:%M') 这行是你需要的,现在我更新答案
    • 是的,当然,我还在尝试。我收到一个错误:“时间数据'2017-03-13 00:00:00'与格式'%H:%M'(匹配)不匹配”
    • 这行得通,但继续绘制图表,生成一个看起来像这样的图表imageupload.net/image/c937p 打开数据框,它具有从 00:00 到 23.59 的所有时间戳,但日期仍然存在尽管改变了格式。
    • 通过添加行解决了问题 plt.ylim(N130317['Time'][0], N130317['Time'][N130317.index[-1]])
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2021-06-01
    • 1970-01-01
    相关资源
    最近更新 更多