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图表,具有丰富的视觉元素和模板选择。