【问题标题】:How do I display even intervals on both axes using matplotlib?如何使用 matplotlib 在两个轴上显示均匀的间隔?
【发布时间】:2018-01-15 17:33:24
【问题描述】:

此代码完全按照我想要的方式绘制数据,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.html, https://matplotlib.org/api/ticker_api.html

【问题讨论】:

  • @ImportanceOfBeingErnest:我不知道如何格式化 y 轴以显示每小时的每小时。至于 x 轴,如果您运行脚本,它会一次又一次地重复同一个月。必须有办法防止这种情况发生,所以它每个月只显示一次。
  • 对于每月刻度,使用MonthLocator,对于每小时刻度,使用HourLocator
  • @ImportanceOfBeingErnest:我让 x 轴正确显示。仍然停留在 y 轴上。查看更新。
  • 现在我们正在取得进展。题中有明显问题,可以回答。

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


【解决方案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()

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2013-08-01
    相关资源
    最近更新 更多