使用Matplotlib在Python中绘制时间

ran*_*ght 145 python plot graph matplotlib

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

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

我试图,但不知何故,它只接受花车阵列.我怎样才能让它画出时间?我是否必须以任何方式修改格式?

cod*_*ape 159

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

使用plot_date以下内容绘制日期和值:

dates = matplotlib.dates.date2num(list_of_datetimes)
matplotlib.pyplot.plot_date(dates, values)
Run Code Online (Sandbox Code Playgroud)

  • plot_dates - > matplotlib.pyplot.plot_date(日期,值) (13认同)
  • 散点图怎么样?我想提供一个大小数组来确定散射气泡的大小,但是没有等效的`scatter_date()`,也没有明显/直接的方法来获得这个图. (3认同)
  • 上面返回一个列表,其中包含一个类型为:matplotlib.lines.Line2D object的对象.现在我如何使用它来显示图表? (3认同)
  • 它会描绘日期还是时间?我只想要在转换到datetime之后的时间,将年份设置为1990. (2认同)

moo*_*eep 77

您还可以使用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()
Run Code Online (Sandbox Code Playgroud)

结果图片:

线图


这与散点图相同:

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()
Run Code Online (Sandbox Code Playgroud)

生成类似于此的图像:

散点图

  • @andi它应该像我的例子一样工作(将`plot`改为`scatter`). (4认同)
  • 如何让它适用于散点图? (2认同)

Geo*_*ins 17

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

在此输入图像描述

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

import matplotlib.dates as mdates
myFmt = mdates.DateFormatter('%d')
ax.xaxis.set_major_formatter(myFmt)
Run Code Online (Sandbox Code Playgroud)

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

感谢社区.


小智 12

我使用matplotlib版本遇到了麻烦:2.0.2.从上面运行示例我得到了一组居中的堆叠气泡.

中心堆栈的气泡图

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

plt.plot([],[])
Run Code Online (Sandbox Code Playgroud)

整个代码段变为:

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()
Run Code Online (Sandbox Code Playgroud)

这产生了具有根据需要分布的气泡的图像.

气泡随时间分布的图形


wur*_*ach 6

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

\n

这是 csv。(忽略我在另一张图中使用的每秒数据包列)

\n
head -2 ~/data\ndate,mbps,pps\n2021-04-01 16:05:37,113,9342.00\n...\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
(base) \xe2\x9e\x9c  graphs ./throughput.py\ndate      object\nmbps      int64\npps       float64\ndtype:    object\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
import matplotlib.pyplot as plt\nimport pandas as pd\n\ndataframe = pd.read_csv("~/data")\n\ndates = dataframe["date"]\nmbps = dataframe["mbps"]\n\nplt.plot(dates, mbps, label="mbps")\nplt.title("throughput")\nplt.xlabel("time")\nplt.ylabel("mbps")\nplt.legend()\nplt.xticks(rotation=45)\n\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

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

\n
dataframe["date"] = pd.to_datetime(dataframe["date"]) \n
Run Code Online (Sandbox Code Playgroud)\n

这次我的约会类型是datetime64[ns]

\n
(base) \xe2\x9e\x9c  graphs ./throughput.py\ndate    datetime64[ns]\nmbps             int64\npps            float64\ndtype:          object\n
Run Code Online (Sandbox Code Playgroud)\n

相同的脚本,但有 1 行差异。

\n
#!/usr/bin/env python\nimport matplotlib.pyplot as plt\nimport pandas as pd\n\ndataframe = pd.read_csv("~/data")\n\n# convert object to datetime64[ns]\ndataframe["date"] = pd.to_datetime(dataframe["date"]) \n\ndates = dataframe["date"]\nmbps = dataframe["mbps"]\n\nplt.plot(dates, mbps, label="mbps")\nplt.title("throughput")\nplt.xlabel("time")\nplt.ylabel("mbps")\nplt.legend()\nplt.xticks(rotation=45)\n\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

在此输入图像描述

\n

  • 凉爽的!是的,创建一个子图来访问 xaxis 属性。这是一个很难显示的注释,但从我上面的示例中添加 `fig,ax = plt.subplots()` 并添加 `date_form = DateFormatter("%d-%m-%Y-%H-%M") `.show()` 之前的 ` 和 `ax.xaxis.set_major_formatter(date_form)` (2认同)