使用Matplotlib绘制时间

epggiuax  于 2023-03-19  发布在  其他
关注(0)|答案(5)|浏览(162)

我有一个格式为(HH:MM:SS.mmmmmm)的时间戳数组和另一个浮点数数组,每个数组对应于时间戳数组中的一个值。
我可以使用Matplotlib在x轴上绘制时间,在y轴上绘制数字吗?
我试过了,但是不知怎么的,它只接受浮点数数组。我怎样才能让它绘制时间呢?我必须以任何方式修改格式吗?

lokaqttq

lokaqttq1#

更新

这个答案从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
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)

kx1ctssn

kx1ctssn2#

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

生成类似于下图的图像:

jexiocij

jexiocij3#

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

使用Matplotlib 2.0.0,我不得不添加Paul H.

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

我将格式更改为(%H:%M),时间显示正确。

感谢社区。

js81xvg6

js81xvg64#

我在使用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()

这将产生气泡按需要分布的图像。

isr3a4wc

isr3a4wc5#

Pandas Dataframe 还没有被提及。我想展示一下这些 Dataframe 是如何解决我的日期时间问题的。我把日期时间设置为毫秒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将日期字符串作为“object”拉入,这只是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)来倾斜日期,但这不是我想要的。我可以将日期“对象”转换为datetime 64 [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()

这可能不是你的理想用例,但它可能会帮助其他人。

相关问题