Matplotlib: получение тиковых часов на оси Y в диаграмме рассеяния - PullRequest
0 голосов
/ 25 мая 2018

Я показываю некоторые измеренные скорости от автомобилей на графике рассеяния.Я хотел бы показать, что низкие скорости часто происходят в определенные периоды дня.Графики работают нормально, но меня не устраивает ось Y.

import pandas as pd
import matplotlib.pyplot as plt

Time = ['2018-03-16 16:15', '2018-03-16 16:30', '2018-03-16 16:45']
Speed = [56, 46, 51]   
df = pd.DataFrame({'Time':pd.to_datetime(Time), 'Speed':Speed})
df.set_index('Time', inplace=True)

plt.scatter(df.index, df.index.time)
plt.xlim('2018-03-04','2018-03-31')
plt.ylim('06:00','20:00')
plt.show()

Дает

Scatter plot

Я бы хотелось Y включает только полные часы (может быть, 06:00, 12:00, 16:00 и 20:00)

Я пробовал что-то вроде

fig,ax = plt.subplots()
hours =mdates.HourLocator(interval=1)
h_fmt =mdates.DateFormatter('%H')
ax.scatter(df.index, df.index.time)
ax.yaxis.set_major_locator(hours)
ax.yaxis.set_major_formatter(h_fmt)
fig.autofmt_xdate()
plt.show()

, что, кажется,генерирует множество тиков.

У кого-нибудь есть решение для этого?

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Как то так?

plt.scatter(df.index, df.index.time)                                                                         
plt.gcf().autofmt_xdate()                                                                                    
yticks = [datetime.time(6,0),datetime.time(10,0),datetime.time(14,0),datetime.time(18,0),datetime.time(22,0)]
ax = plt.gca()                                                                                               
ax.set_yticks(yticks)                                                                                        
plt.show()                                                                                                   

enter image description here

0 голосов
/ 25 мая 2018

Это связано с тем, как matplotlib обрабатывает объекты datetime.time.Попробуйте это:

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

Time = ['2018-03-16 16:15', '2018-03-16 16:30', '2018-03-16 16:45']
time = [datetime.strptime(d,'%Y-%m-%d %H:%M') for d in Time]
Speed = [56, 46, 51]
df = pd.DataFrame({'Time':pd.to_datetime(Time), 'Speed':Speed})
df.set_index('Time', inplace=True)

plt.scatter(df.index, time)
plt.xlim('2018-03-04','2018-03-31')
plt.ylim('2018-03-16 06:00','2018-03-16 20:00')
plt.show()
0 голосов
/ 25 мая 2018

Это не идеальное решение, но вы могли бы просто сделать что-то вроде

df['time'] = df.index.hour + df.index.minute/60 #if Python 2.x Cast minute as a float
df.plot(x = 'time',y = 'Speed', kind = 'scatter')

Вам нужно будет интерпретировать минуты как доли часа (например, 16.5 - это действительно 16:30), ноэто достаточно хорошо, чтобы делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...