数据可视化包Matplotib的案例 数据可视化基础matplotlib_时间序列

简介

数据可视化是让我们感知数据的一种重要手段,通过不同的数据可视化的方式,使得我们可以在不同维度去理解当前的数据。

数据可视化的基本原理就是,人脑对色块的敏感性远大于数字,从演化论角度来讲,可以很好的分辨出不同颜色事物的祖先更容易活下来,而数字,那个时候并没有,所以进化而来的大脑并不擅长处理数字,进而对干巴巴的数据不敏感。


Matplotlib 简单概念

Matplotlib 是 Python 中用于绘制二维图形的知名第三方库 (如果要绘制三维图形,需要额外安装一些支持包),也是很多几天高层次数据可视化第三方库的基础支持库。

Matplotlib 中绘制的图有下面集中元素:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据_02

解释一下:

  • Major tick:主线
  • Minor tick:线上的刻度
  • Major tick label:主线上的标签
  • Title:整个图的标题
  • Legend:标注
  • Y axis label:Y 轴的标签
  • Line:绘制的线
  • Grid:网格
  • Markers:标记
  • Figure:图形
  • Axes:轴域

上图就是 Matplotlib 绘制的整个窗口,图中包含了实际图表、x 轴、y 轴以及每个轴对应的标题、刻度和标签。在 Matplotlib 中可以为图形添加多个轴域,具体而言,就是使用 pyplot 来创建多个轴域并改变其形状。

这里可能会疑惑,Figure、Axes 与 Axis 之间有什么关系?特别是 Axes 与 Axis,英文直译都称为轴,可以通过一张图解释三者的关系。

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据_03

绘制图像的常见步骤

大多数时候,使用 Matplotlib 绘制数据的流程是类似的,虽然有些特殊的图像绘制需要一下特殊的操作,但大体流程都相似

  • 1. 通过 Pandas 将要绘制图像的数据读入,如 pd.readcsv () 读入 csv 文件数据、pd.readexcel () 读取 Excel 文件数据
  • 2. 导入 Matplotlib , 具体为: import matplotlib.pyplot as plt
  • 3. 使用 plt.plot () 绘制折线图,不同的图使用不同的绘图函数,所有的绘图函数都需要传入相应的数据
  • 4. 使用 plt.xlabel 与 plt.ylabel 定义 x 轴与 y 轴的标签,如定义标签字体样式、字体大小、字段位置等待,如果不使用,Matplotlib 就会使用默认的样式将要显示的内容在标签处显示。需要注意的是,默认的样式是不支持显示中文的,如果此时你的标签要显示的内容是中文,那么 Matplotlib 生成的图像中,标签位置对应的内容会成为一个空方块,要显示中文,需要指定字体。
  • 5. 使用 plt.xticks 与 plt.yticks 定义 x 轴与 y 轴上的标记点,如定义标点的间隔
  • 6. 使用 plt.legend () 标注,如折线图中有 3 条不同颜色的折线,通过 legend () 方法就可以标注出不同折线的含义
  • 7. 使用 plt.title () 定义图中的标题
  • 8. 使用 plt.show () 将最终的图像展示出来。

接着,就来看一些具体图像的绘制

直方图

直方图是我们比较常见的简单图像,它有助于我们理解数据的范围以及加强我们对数据的整体感知。

这里以商店销售特定游戏数据为例来绘制直方图,先来看一下数据的样子

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
np_data=pd.read_csv('datasets/national_parks.csv')
print(np_data.head()) # 打印前5行数据

前 5 行数据如下:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_时间序列_04

绘制直方图的代码如下:

n, bins, patches = plt.hist(np_data['GrandCanyon'],  # 某一类游戏的数据
         facecolor='orange',  # 直方图中矩形的颜色
         edgecolor='blue',  # 直方图中矩形边的颜色
         bins=10 # 绘制多少个矩形
) 
plt.show()
print('n: ', n) # 表示每个矩形在 y 轴的最大值
print('bins: ', bins) # 表示每个矩形在 x 轴的值
print('patches: ', patches) # 每个矩形对应的 patch 对象

效果如下:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据_05

其中打印的内容如下:

n:  [ 5.  9. 10.  2.  1.  9. 16.  2.  1.  2.]
bins:  [1253000.  1753123.8 2253247.6 2753371.4 3253495.2 3753619.  4253742.8
 4753866.6 5253990.4 5754114.2 6254238. ]
patches:  <a list of 10 Patch objects>

绘制直方图时,可以将 cumulative 设置为 true,此时绘制直方图时,会将每个矩形前的所有矩形的 y 轴值累加并加上当前矩形的 y 轴值,然后再绘制这个矩形,代码与效果如下:

plt.hist(np_data['GrandCanyon'], 
         facecolor='orange', 
         edgecolor='blue', 
         bins=10,
         cumulative=True) # 累加属性设置为True
plt.show()

数据可视化包Matplotib的案例 数据可视化基础matplotlib_直方图_06

此外可以通过 range 属性来定义你想要看的直方图范围,比如我只关心 (2000000, 5000000) 之间的数据,其他数据我不关心,就可以用上 range,使用如下:

plt.hist(np_data['GrandCanyon'], 
         facecolor='orange', 
         edgecolor='blue', 
         bins=10,
         range=(2000000, 5000000))
plt.show()

效果如下,主要观察图中的 x 轴,x 轴不会超出 (2000000, 5000000) 这个范围

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据_07

饼图

饼图也是一种常见的图像,它可以帮助我们理解数据中某个部分占总体数据的比例,此外,饼图并不适合用于说明一下信息,首先依旧是读入用于绘制饼图的数据

t_mov= pd.read_csv('datasets/types_movies.csv')
print(t_mov)

数据如下:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_直方图_08

绘制饼图的代码如下:

plt.pie(t_mov['Percentage'],  # 计算比例的具体数据
        labels=t_mov['Sector']) # 对应的标签
plt.axis('equal')
plt.show()

效果如下:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据可视化包Matplotib的案例_09

如果想要定制饼图的颜色,直接通过 colors 参数,指定一组颜色则可,如下:

colors = ['darkorange', 'sandybrown', 'darksalmon', 'orangered','chocolate']
plt.pie(t_mov['Percentage'], 
        labels=t_mov['Sector'], 
        colors=colors, 
        autopct='%.2f')
plt.axis('equal')
plt.show()

效果如图:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据_10

此外饼图还能绘制成类似披萨的形态,即即让一些扇形不拼接在一起,指定 explode 参数则可,如下:

explode = (0, 0.1, 0, 0, 0)
plt.pie(t_mov['Percentage'], 
        labels=t_mov['Sector'], 
        colors=colors, 
        autopct='%.2f',
        explode=explode)
plt.axis('equal')
plt.show()

效果如图:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_时间序列_11

时间序列线图

一些具有时间顺序属性的数据可以被称为时间序列数据,股票数据就是一种典型的时间序列数据,通过这些数据绘制一条时间序列线图可以帮助我们更好的了解数据随着时间的推移有什么变化,下面以部分美股的股票数据为例绘制一下时间序列线图。

简单看一下数据

stock_data = pd.read_csv('datasets/stocks.csv')
# 将其中的日期转为Pandas中的DataTime,会更方便处理
stock_data['Date'] = pd.to_datetime(stock_data['Date'])
stock_data.head()

数据可视化包Matplotib的案例 数据可视化基础matplotlib_直方图_12

接着来绘制一下时间序列线图,代码如下:

fig = plt.figure(figsize=(10,6)) # 定义画布大小
# 多个轴域进行作图
ax1 = fig.add_axes([0, 0, 1, 1]) # 添加轴域
ax2 = fig.add_axes([0.05, 0.65, 0.5, 0.3]) # 添加轴域
# 设置标题
ax1.set_title('AAPL vs IBM(inset)')
# 第一个轴域进行绘图
ax1.plot(stock_data['Date'],
         stock_data['AAPL'],
         color='green')
# 第二个轴域进行绘图
ax2.plot(stock_data['Date'],
         stock_data['IBM'], 
         color='blue')
plt.show()

上述代码中,为了比对两支不同的股票在相同时间段内的走势,这里调用了 add_axes ([x0, y0, width, height]) 方法,其前两个参数用于定义轴域左上角的开始位置,而 width 与 height 用于定义轴域的大小,定义好了轴域后就可以在其上绘图了,效果如下:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据可视化包Matplotib的案例_13

通过与上面类似的方法,可以添加多个轴域绘制多个时间序列线图,如下:

# Figsize for width and height of plot
fig = plt.figure(figsize=(15,7))
fig.suptitle('Stock price comparison 2007-2017', 
             fontsize=20)
ax1 = fig.add_subplot(231)
ax1.set_title('MSFT')
ax1.plot(stock_data['Date'],
         stock_data['MSFT'], 
         color='green')
ax2 = fig.add_subplot(232)
ax2.set_title('GOOG')
ax2.plot(stock_data['Date'],
         stock_data['GOOG'], 
         color='purple')
ax3 = fig.add_subplot(233)
ax3.set_title('SBUX')
ax3.plot(stock_data['Date'],
         stock_data['SBUX'], 
         color='magenta')
ax4 = fig.add_subplot(234)
ax4.set_title('ADBE')
ax4.plot(stock_data['Date'],
         stock_data['ADBE'], 
         color='orange')
ax4 = fig.add_subplot(235)
ax4.set_title('NFLX')
ax4.plot(stock_data['Date'],
         stock_data['NFLX'], 
         color='chocolate')
ax4 = fig.add_subplot(236)
ax4.set_title('ORCL')
ax4.plot(stock_data['Date'],
         stock_data['ORCL'], 
         color='teal')
plt.show()

效果如下:

数据可视化包Matplotib的案例 数据可视化基础matplotlib_数据_14

结尾

本篇文章介绍了一部分 Matplotlib 可视化数据的用法,在下一文章中会介绍 Matplotlib 绘制其他图的用法,