我有一个时间戳数组,格式为(HH:MM:SS.mmmmmm),还有另一个浮点数数组,每个值对应于时间戳数组中的一个值。
我能否使用Matplotlib将时间作为x轴,数字作为y轴进行绘图?
我尝试过,但它似乎只接受浮点数数组。我该如何让它绘制时间?我需要以任何方式修改格式吗?
我有一个时间戳数组,格式为(HH:MM:SS.mmmmmm),还有另一个浮点数数组,每个值对应于时间戳数组中的一个值。
我能否使用Matplotlib将时间作为x轴,数字作为y轴进行绘图?
我尝试过,但它似乎只接受浮点数数组。我该如何让它绘制时间?我需要以任何方式修改格式吗?
更新:
本回答已过时,自 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)
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()
生成类似于这个的图像:
类型错误 - 无效的类型提升
。 - dwandersondatetime.datetime
对象。 - moooeeeepplt.grid(True)
。 - Christophe Roussymatplotlib.__version__
2.2.2 下适用于我。散点图默认设置了一些过宽的 x 轴限制。不过,这个答案提供了一种解决方法,而不是手动调整 plt.xlim(...)
:https://dev59.com/f3I_5IYBdhLWcg3wAd82#46467896 - moooeeeep七年后,这段代码仍然帮了我很多。不过,我的时间仍然没有正确显示。
使用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),时间正确显示。
我在使用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()
还没有提到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
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
同样的脚本只有一行不同。
#!/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()
fig,ax = plt.subplots()
,并在.show()
之前添加date_form = DateFormatter("%d-%m-%Y-%H-%M")
和ax.xaxis.set_major_formatter(date_form)
。 - b0bu
scatter_date()
函数,并且没有明显/直接的方法来获取这张图表。 - dwanderson