在独立轴上绘制时间

2024-12-13 08:36:00
admin
原创
132
摘要:问题描述:我有一个格式为 (HH:MM:SS.mmmmmm) 的时间戳数组和另一个浮点数数组,每个数组对应时间戳数组中的一个值。我可以使用 Matplotlib 在 x 轴上绘制时间并在 y 轴上绘制数字吗?我尝试过,但不知何故它只接受浮点数组。我怎样才能让它绘制时间?我必须以某种方式修改格式吗?解决方案 1...

问题描述:

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

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

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


解决方案 1:

更新

自 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。


旧的、过时的答案:

您必须首先将时间戳转换为 Pythondatetime对象(使用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)

在此处输入图片描述

解决方案 2:

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

产生类似这样的图像:

散点图

解决方案 3:

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),时间就正确显示了。
在此处输入图片描述

这一切都要感谢社区。

解决方案 4:

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

这样就会生成一幅气泡按所需分布的图像。

气泡随时间分布的图表

解决方案 5:

尚未提及 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

相同的脚本,只有一行不同。

#!/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()

这可能并不适合您的使用情况,但可能会对其他人有所帮助。

在此处输入图片描述

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用