Python中的时序数据可视化技巧

1. 简介

时序数据,是指在连续不断的时间架构下采集或生成的数据。它通常采用时间作为自变量进行建模、分析和预测。在数据分析和可视化中,时序数据可帮助我们识别趋势、周期性和异常情况。Python中有多种可视化库可以展示时序数据,本文将讨论一些常用的技巧。

2. matplotlib绘制时序数据

2.1 基本绘图方法

matplotlib是Python中最流行的绘图库之一,也可以用于时序数据的可视化。下面的代码展示了如何用matplotlib绘制时序数据的基本方法:

import matplotlib.pyplot as plt

import numpy as np

# 生成一组随机时序数据

np.random.seed(0)

data = np.random.randn(100)

plt.plot(data)

plt.show()

这段代码产生了100个符合标准正态分布的随机数,并用plt.plot(data)绘制了随机数对应的时序数据。

我们可以进一步添加其他组件,使图像更具可读性,比如添加标题、坐标轴标签:

plt.plot(data)

plt.title('Random Time Series Data')

plt.xlabel('Time')

plt.ylabel('Value')

plt.show()

此时图像中会出现标题、x轴标签和y轴标签:

2.2 绘制多个时序数据的图像

通常情况下,我们会同时针对多组时序数据进行绘图,因为这些数据通常有一定的相关性(可以用相交的点来表示)。这时,我们可以将多组数据分别存储为不同的数组,再用plt.plot()逐个绘制。

下面的代码生成三组随机的散点数据,并按照不同颜色绘制到同一张图表上:

# 生成三组随机数据

np.random.seed(0)

data1 = np.random.randn(100)

data2 = np.random.randn(100) + 1

data3 = np.random.randn(100) - 1

# 分别用不同颜色绘制这三组数据

plt.plot(data1, color='blue')

plt.plot(data2, color='green')

plt.plot(data3, color='red')

plt.show()

绘制结果图如下:

绘图时,还可以利用plt.subplot()函数将多个图像排列在一个图表中。下面的代码利用plt.subplot()函数将四组随机数的散点图像分别放在四个子图中:

# 生成四组不同的随机数据

np.random.seed(0)

data1 = np.random.randn(100)

data2 = np.random.randn(100) + 1

data3 = np.random.randn(100) - 1

data4 = np.random.randn(100) * 2

# 绘制第一个子图

plt.subplot(2, 2, 1)

plt.plot(data1, color='blue')

# 绘制第二个子图

plt.subplot(2, 2, 2)

plt.plot(data2, color='green')

# 绘制第三个子图

plt.subplot(2,2,3)

plt.plot(data3, color='red')

# 绘制第四个子图

plt.subplot(2,2,4)

plt.plot(data4, color='purple')

plt.show()

绘制结果:

3. seaborn绘制时序数据

seaborn是基于matplotlib的Python数据可视化库,它提供了许多方便实用的统计图函数。seaborn可以方便地绘制时序数据,并自动添加有用的信息,例如置信区间和均值线。下面的代码展示了如何在seaborn中绘制时序图:

import seaborn as sns

import pandas as pd

# 生成一组随机数据

np.random.seed(0)

data = np.random.randn(100)

# 将随机数据存储为时序数据的DataFrame对象

df = pd.DataFrame({'value': data, 'time': pd.date_range('1/1/2022', periods=100, freq='D')})

# 绘制时序图

sns.lineplot(x='time', y='value', data=df)

plt.show()

这段代码利用pd.date_range()函数生成了一组100天的时间序列,并用pd.DataFrame()将这组时间序列和随机数据组合成了一个DataFrame对象。然后用sns.lineplot()绘制了时序图。

seaborn还提供了多种时间处理、数据摘要和可视化函数,例如residplot()、regplot()等,可以帮助我们更好地分析时序数据。

4. plotly绘制时序数据

plotly是基于Web的数据可视化库,用于在Web浏览器中创建交互式图表。plotly可以生成可交互、可缩放的HTML图表,以JavaScript代码的形式呈现。

4.1 基本时序图的绘制方法

下面的代码展示了如何用plotly绘制基本的时序图:

import plotly.express as px

import numpy as np

# 生成一组随机时间序列和数据

np.random.seed(0)

data = np.random.randn(100)

time = np.arange('2022-01-01', '2022-04-11', dtype='datetime64[D]')

# 把数据和时间序列转化为pandas的DataFrame对象

df = pd.DataFrame({'time': time, 'value': data})

# 绘制基本时序图

fig = px.line(df, x='time', y='value')

fig.show()

这段代码利用了plotly.express库的px.line()函数绘制了基本的时序图像。绘图结果如下:

4.2 在时序图中展示多个数据集

我们可以将多个时序数据集绘制到同一张图表中,代码如下:

# 生成三组随机数据

np.random.seed(0)

data1 = np.random.randn(100)

data2 = np.random.randn(100) + 1

data3 = np.random.randn(100) - 1

time = np.arange('2022-01-01', '2022-04-11', dtype='datetime64[D]')

# 把数据和时间序列转化为pandas的DataFrame对象

df = pd.DataFrame({

'time': np.tile(time, 3),

'value': np.hstack([data1, data2, data3]),

'name': ['data1']*100 + ['data2']*100 + ['data3']*100,

})

# 绘制多组时序数据

fig = px.line(df, x='time', y='value', color='name')

fig.show()

这段代码将三组数据存储为同一个DataFrame对象,然后利用px.line()函数绘制多组数据在同一张图表中的时序图像。绘图结果如下:

4.3 在时序数据图中添加元素

在plotly中,我们可以用图例、标签、直线、点标记、网格线等方式增强图表的可读性,使图像更具信息含量。下面的代码展示了如何在时序图中添加元素:

# 增加一个名为“threshold”的列,表示阈值

df['threshold'] = 0.2

# 绘制带有元素的时序图

fig = px.line(df, x='time', y='value', color='name')

fig.add_hline(y=0.2, line_dash='dash', line_color='gray')

fig.update_layout(title='Multiple Time Series', xaxis_title='Time', yaxis_title='Value')

fig.show()

这段代码在图像中添加了一条横线和标题,绘图结果如下:

5. 总结

Python中有多种可视化工具用来展示时序数据,matplotlib、seaborn和plotly是最常用的三种。matplotlib是最基础的可视化库之一,它提供了丰富的绘图工具和参数,不过绘制出来的图像相对普通。seaborn库则可以让我们方便地完成更为复杂的统计图表,不过它不如matplotlib库灵活。plotly库是一种基于Web的交互式可视化库,可以生成交互式、可定制、可分享的HTML图表,具有丰富的视觉元素和模板选择。

后端开发标签