196

我有一个格式为 (HH:MM:SS.mmmmmm) 的时间戳数组和另一个浮点数数组,每个数组对应于时间戳数组中的一个值。

我可以使用 Matplotlib 在 x 轴上绘制时间和在 y 轴上绘制数字吗?

我试图这样做,但不知何故它只接受浮点数组。我怎样才能让它绘制时间?我必须以任何方式修改格式吗?

4

5 回答 5

210

您必须首先将时间戳转换为 Pythondatetime对象(使用datetime.strptime)。然后用于date2num将日期转换为 matplotlib 格式。

使用 绘制日期和值plot_date

import matplotlib.pyplot
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)
matplotlib.pyplot.plot_date(dates, y_values)

在此处输入图像描述

于 2009-10-15T18:18:26.013 回答
101

您还可以使用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()

生成与此类似的图像:

散点图

于 2013-05-07T20:30:05.907 回答
36

7 年后,这段代码帮助了我。但是,我的时间仍然没有正确显示。

在此处输入图像描述

使用 Matplotlib 2.0.0,我必须添加以下代码,来自Paul H.在 matplotlib 中编辑 x 轴刻度标签的日期格式。

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

我将格式更改为 (%H:%M) 并正确显示时间。 在此处输入图像描述

感谢社区。

于 2017-07-13T21:05:01.137 回答
25

我在使用 matplotlib 版本时遇到了问题:2.0.2。从上面运行示例,我得到了一组居中堆叠的气泡。

具有居中气泡堆栈的图形

我通过添加另一行“修复”了这个问题:

plt.plot([],[])

整个代码片段变为:

import datetime
import random
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


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

# plot
plt.plot([],[])
plt.scatter(x,y)

# beautify the x-labels
plt.gcf().autofmt_xdate()
myFmt = mdates.DateFormatter('%H:%M')
plt.gca().xaxis.set_major_formatter(myFmt)

plt.show()
plt.close()

这会产生一个气泡根据需要分布的图像。

随时间分布的气泡图

于 2017-09-28T11:21:40.110 回答
3

尚未提及 Pandas 数据框。我想展示这些如何解决我的日期时间问题。我有日期时间到毫秒2021-04-01 16:05:37。我正在从 /proc 中提取 linux/haproxy 吞吐量,因此我可以根据自己的喜好对其进行真正的格式化。这对于将数据输入实时图形动画非常有用。

下面看一下csv。(忽略我在另一个图中使用的每秒数据包数列)

head -2 ~/data
date,mbps,pps
2021-04-01 16:05:37,113,9342.00
...

通过使用print(dataframe.dtype),我可以看到数据是如何被读取的:

(base) ➜  graphs ./throughput.py
date      object
mbps      int64
pps       float64
dtype:    object

Pandas 将日期字符串作为“对象”拉入,它只是类型 char。在脚本中按原样使用:

import matplotlib.pyplot as plt
import pandas as pd

dataframe = pd.read_csv("~/data")

dates = dataframe["date"]
mbps = dataframe["mbps"]

plt.plot(dates, mbps, label="mbps")
plt.title("throughput")
plt.xlabel("time")
plt.ylabel("mbps")
plt.legend()
plt.xticks(rotation=45)

plt.show()

在此处输入图像描述

Matplotlib 呈现所有毫秒时间数据。我添加plt.xticks(rotation=45)了倾斜日期,但这不是我想要的。我可以将日期“对象”转换为 datetime64[ns]。哪个 matplotlib 确实知道如何渲染。

dataframe["date"] = pd.to_datetime(dataframe["date"]) 

这次我的日期是类型datetime64[ns]

(base) ➜  graphs ./throughput.py
date    datetime64[ns]
mbps             int64
pps            float64
dtype:          object

相同的脚本有 1 行差异。

#!/usr/bin/env python
import matplotlib.pyplot as plt
import pandas as pd

dataframe = pd.read_csv("~/data")

# convert object to datetime64[ns]
dataframe["date"] = pd.to_datetime(dataframe["date"]) 

dates = dataframe["date"]
mbps = dataframe["mbps"]

plt.plot(dates, mbps, label="mbps")
plt.title("throughput")
plt.xlabel("time")
plt.ylabel("mbps")
plt.legend()
plt.xticks(rotation=45)

plt.show()

这可能不适合您的用例,但可能对其他人有所帮助。

在此处输入图像描述

于 2021-04-01T16:43:11.023 回答