使用 matplotlib 绘制大量时间序列数据点

Min*_*hoy 5 python visualization time-series matplotlib scatter-plot

我在一个月(30 天)中每 5 分钟收集一次传感器数据。这意味着,我有一个时间序列数据,总共有 288*30 个数据点。

我想散点图数据(x 轴:时间,y 轴:传感器值)。以下代码用于测试。

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np

# generate time series randomly (length: 1 month)
rng=pd.date_range("2015-11-11",periods=288*30,freq="5min")
ts=pd.Series(np.random.randn(len(rng)),rng)

nr=3
nc=1

fig=plt.figure(1)
fig.subplots_adjust(left=0.04,top=1,bottom=0.02,right=0.98,wspace=0.1,hspace=0.1)

for i in range(3):
    ctr=i+1
    ax=fig.add_subplot(nr,nc,ctr)

    ax.scatter(ts.index,ts.values)
    ax.set_xlim(ts.index.min(),ts.index.max())

plt.show()
Run Code Online (Sandbox Code Playgroud)

我生成了具有 288*30 个观测值的随机时间序列数据,并试图将其绘制在散点图中。但是,如您所见,无法分析该图。

在此处输入图片说明

我想重绘它满足以下条件:

  1. 我想要图的放大版本。换句话说,某个时间范围(例如,2~3 小时)的部分数据点被一次性显示出来。然后,相邻点之间应该有足够的空间。

  2. 我想将图形保存为 png 或 pdf 文件。然后,如果我打开文件,图像(或 pdf)查看器有一个水平滚动条,使我能够浏览整个图形。

有谁能解决吗?

我认为对于 matplotlib 专家来说并不难,但对于我这个初学者来说却很难。

Dav*_*d Z 3

读者注意:由于问题的澄清,答案与 v1 相比发生了显着变化

  1. 我想要该图的放大版本。换句话说,一次显示某个时间范围(例如2~3小时)的部分数据点。然后,相邻点之间应该有足够的空间。

matplotlib 中的缩放是通过轴的 x 和 y 限制来实现的。因此,您只需更改调用的参数,ax.set_xlim使相应的时间相差 2-3 小时或您想要的任意时间。知道每 5 分钟就有一个样本,因为 2 小时/(5 分钟/样本)= 24,您可以使用

ax.set_xlim(ts.index.min(),ts.index.min() + 24)
Run Code Online (Sandbox Code Playgroud)

获得 2 小时范围。

  1. 我想将图形保存为 png 或 pdf 文件。然后,如果我打开文件,图像(或 pdf)查看器会有一个水平滚动条,使我能够探索整个图形。

用于savefig将图形保存到文件中。set_xlim请注意,如果您使用或或等效项设置了轴限制xlim,则这将仅保存给定限制内可见的图形部分。因此,要保存整个图形(所有数据点可见),您需要分别将轴限制设置为最小值和最大值。

当您在查看器中打开图像/PDF 文件时,是否显示滚动条(以及显示多少图形)完全取决于查看器。你无法在 Python 中控制它。但是您可以通过使图形在水平方向上变得很大来给它一些显示水平滚动条的机会。为此,您可以figsize=(width, height)在创建图窗时传递关键字参数,或在现有对象上使用该set_size_inches(width, height)方法Figure。两种情况下的测量值均以英寸为单位。传递一个比 forwidth大得多的值height,你会得到一个非常宽的数字;例如,40宽度和4高度。您必须对这些值进行试验,以找出哪些值可以使您的图形达到您想要的比例。