如何使用matplotlib在两个轴上显示均匀间隔?

时间:2018-01-15 17:33:25

标签: python python-3.x pandas matplotlib plot

此代码完全按照我的要求绘制数据,包括x轴上的日期和y轴上的时间。但是我希望y轴显示小时的每小时(例如,00,01,... 23)和x轴以每个角度显示每个月的开始,因此没有重叠(实际数据是使用跨度超过一年)并且只使用一次,因为此代码重复相同的月份。这是如何完成的?

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

data = ['2018-01-01 09:28:52', '2018-01-03 13:02:44', '2018-01-03 15:30:27', '2018-02-04 11:55:09']

f, ax = plt.subplots()
data = pd.to_datetime(data, yearfirst=True)
ax.plot(data.date, data.time, '.')
ax.set_ylim(["00:00:00", "23:59:59"])

days = mdates.DayLocator()
d_fmt = mdates.DateFormatter('%Y-%m')
ax.xaxis.set_major_locator(days)
ax.xaxis.set_major_formatter(d_fmt) 

plt.show()

更新:这会修复x轴。

# Monthly intervals on x axis
months = mdates.MonthLocator()
d_fmt = mdates.DateFormatter('%Y-%m') 
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(d_fmt)

但是,这种修复y轴的尝试只是将其设为空白。

# Hourly intervals on y axis
hours = mdates.HourLocator()
t_fmt = mdates.DateFormatter('%H')
ax.yaxis.set_major_locator(hours)
ax.yaxis.set_major_formatter(t_fmt)

我正在阅读这些文档,但没有理解我的错误:https://matplotlib.org/api/dates_api.htmlhttps://matplotlib.org/api/ticker_api.html

1 个答案:

答案 0 :(得分:1)

Matplotlib无法绘制没有相应日期的时间。这将是必要的添加一些任意日期(在下面的情况下,我采取2018年1月1日)的时间。可以将datetime.datetime.combine用于此目的。

timetodatetime = lambda x:dt.datetime.combine(dt.date(2018, 1, 1), x)
time = list(map(timetodatetime, data.time))

ax.plot(data.date, time, '.')

然后使用HourLocator()的问题中的代码可以正常工作。最后,在轴上设置限制还需要使用datetime个对象,

ax.set_ylim([dt.datetime(2018,1,1,0), dt.datetime(2018,1,2,0)])

完整示例:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import datetime as dt

data = ['2018-01-01 09:28:52', '2018-01-03 13:02:44', '2018-01-03 15:30:27', 
        '2018-02-04 11:55:09']

f, ax = plt.subplots()
data = pd.to_datetime(data, yearfirst=True)
timetodatetime = lambda x:dt.datetime.combine(dt.date(2018, 1, 1), x)
time = list(map(timetodatetime, data.time))

ax.plot(data.date, time, '.')

# Monthly intervals on x axis
months = mdates.MonthLocator()
d_fmt = mdates.DateFormatter('%Y-%m') 
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(d_fmt)

## Hourly intervals on y axis
hours = mdates.HourLocator()
t_fmt = mdates.DateFormatter('%H')
ax.yaxis.set_major_locator(hours)
ax.yaxis.set_major_formatter(t_fmt)

ax.set_ylim([dt.datetime(2018,1,1,0), dt.datetime(2018,1,2,0)])

plt.show()

enter image description here