将时间绘制在独立轴上

214 投票
5 回答
605620 浏览
提问于 2025-04-15 15:06

我有一个时间戳的数组,格式是(HH:MM:SS.mmmmmm),还有一个浮点数的数组,每个浮点数对应一个时间戳。

我能不能用Matplotlib把时间放在x轴上,把数字放在y轴上呢?

我试过这样做,但好像只接受浮点数的数组。请问我该怎么做才能把时间画出来?我需要修改格式吗?

5 个回答

43

七年后,这段代码还是帮了我。不过,我的时间显示还是不太对。

这里放图片描述

我在使用Matplotlib 2.0.0的时候,需要加上以下这段代码,来源于编辑Matplotlib中x轴刻度标签的日期格式,作者是Paul H.

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)

我把格式改成了(%H:%M),这样时间就正确显示了。

这里放图片描述

这一切都要感谢社区的帮助。

107

你也可以使用 pyplot.plot 来绘制时间戳和数值的配对图(在将它们从字符串格式解析出来之后)。这个方法在 matplotlib 版本 1.2.0 和 1.3.1 中测试过。

下面是一个例子:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.plot(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

生成的图像:

折线图


这里是同样的数据用散点图表示:

import datetime
import random
import matplotlib.pyplot as plt

# make up some data
x = [datetime.datetime.now() + datetime.timedelta(hours=i) for i in range(12)]
y = [i+random.gauss(0,1) for i,_ in enumerate(x)]

# plot
plt.scatter(x,y)
# beautify the x-labels
plt.gcf().autofmt_xdate()

plt.show()

产生的图像类似于这个:

散点图

223

更新

这个回答已经过时了,因为从 matplotlib 3.5 版本 开始,plot 函数现在可以直接处理日期时间数据。详细信息请查看 https://matplotlib.org/3.5.1/api/_as_gen/matplotlib.pyplot.plot_date.html

不建议使用 plot_date。这个方法存在是因为历史原因,未来可能会被淘汰。

类似日期时间的数据应该直接使用 plot 来绘制。

如果你需要将普通的数字数据以 Matplotlib 日期格式绘制,或者需要设置时区,可以在绘图之前调用 ax.xaxis.axis_date / ax.yaxis.axis_date。请参见 Axis.axis_date。


旧的、过时的回答:

你首先需要将时间戳转换为 Python 的 datetime 对象(使用 datetime.strptime)。然后使用 date2num 将日期转换为 matplotlib 格式。

使用 plot_date 绘制日期和数值:

import matplotlib.pyplot as plt
import matplotlib.dates

from datetime import datetime

x_values = [datetime(2021, 11, 18, 12), datetime(2021, 11, 18, 14), datetime(2021, 11, 18, 16)]
y_values = [1.0, 3.0, 2.0]

dates = matplotlib.dates.date2num(x_values)
plt.plot_date(dates, y_values)

在此输入图片描述

撰写回答