我想用 python 的 matplotlib 模块制作一个通用的值与时间图。我的时间是 unix 时间,但我希望它们以可读的格式显示在绘图的 x 轴上。
我已阅读有关使用日期时间对象进行绘图的答案,但此方法似乎删除了小时/分钟/秒信息和全天的轨道时间戳。有没有办法生成这些图并显示更细粒度的标签?
可以调用
plt.plot(dates,values)
,其中 dates
是 datetime.datetime
对象的列表。该图将包含 '%Y-%m-%d'
格式的 xticks,当您放大时,会自动更改为显示小时、分钟、秒的格式。
但是,听起来您想要更多的控制权。也许它没有按照您希望的比例显示小时、分钟、秒。
在这种情况下,您可以设置自己的日期格式化程序:
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
不幸的是,如果将
datetime.datetime
对象传递给 plt.plot
,matplotlib 自动选择的 xticks 似乎总是秒数为零。例如,如果你运行
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(dates,values)
plt.show()
然后你会得到格式良好的日期,但所有 xtick 秒都为零。
那么解决办法是什么呢?
如果您自己转换时间戳 --> datetime.datetime 对象 --> matplotlib datenums,并将 datenums 传递给
plt.plot
,那么秒数将被保留。
PS。 “matplotlib datenum”是指
matplotlib.dates.date2num
返回的数字类型。
import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time
n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
datenums=md.date2num(dates)
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(datenums,values)
plt.show()
从这里:https://matplotlib.org/stable/api/dates_api.html#matplotlib.dates.DateFormatter
import datetime
import matplotlib.dates as mdates
base = datetime.datetime(2005, 2, 1)
dates = np.array([base + datetime.timedelta(hours=(2 * i))
for i in range(732)])
N = len(dates)
np.random.seed(19680801)
y = np.cumsum(np.random.randn(N))
fig, ax = plt.subplots(constrained_layout=True)
locator = mdates.AutoDateLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
ax.plot(dates, y)
ax.set_title('Concise Date Formatter')