簡體   English   中英

Matplotlib:在散點圖中的 y 軸上自動將時間列顯示為 2 小時刻度

[英]Matplotlib: Automatically displaying time column as 2 hour ticks on y axis in scatterplot

我有這個數據:

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'))

我使用以下方法制作了 plot:

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 軸上,顯然沒有空間給它們 - 我的日期中的每一分鍾都有一個時間戳):

圖片

我能做些什么來解決這個問題? 任何幫助將不勝感激。 我在網上嘗試了很多東西。

我使用這些行來創建一些數據,用您的數據替換它們:

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()

它給了我這個 plot:

在此處輸入圖像描述


請注意, pd.to_datetime()必須應用於datetime時間 object,而不是字符串。 如果您運行此代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM