Matplotlib:在散点图中获取y轴上的完整小时刻度

时间:2018-05-25 12:29:44

标签: python-3.x pandas matplotlib

我在散点图中绘制了汽车的一些测量速度。我想表明在一天中的某些时段经常会出现低速。绘图工作正常,但我对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 :(得分:1)

这样的东西?

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这不是一个理想的解决方案,但您可以执行类似

的操作
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真的是下午4:30),但它足以做你想做的事。