Python matplotlib 数据可视化

引言

这篇记载一下 Python 环境下使用 matplotlib 绘制各种曲线图的用法,阅读这篇文章你将会获得如下内容:

  • matplotlib 及环境配置。
  • 一幅数据绘图的结构都是如何组成的,与 matplotlib 相关的名称是如何对应的?
  • 常见的数据绘图都包含哪些,以及是如何绘制的?

你可能需要的先前技能如下:

  • Python 开发环境及 matplotlib 工具包
  • Python 基础语法
  • Python numpy 包使用

matplotlib 安装配置

使用 Python 进行数据绘图前,Python 环境的安装配置是必须,请参看这篇文章:
Python 环境安装配置

在各种环境中 (Windows、Linux、Mac) 的 matplotlib 环境安装配置如下: (以 Ubuntu 为例)

1
2
3
4
5
6
7
# 推荐使用这种方式安装
# 安装 numpy、scipy包
sudo apt-get install python-numpy
sudo apt-get install python-scipy

# 安装 matplotlib 包
sudo apt-get install python-matplotlib

当然也可以使用 pip 安装:

1
2
3
sudo pip install numpy
sudo pip install scipy
sudo pip install matplotlib

图的基本结构

通常,使用 numpy 组织数据, 使用 matplotlib API 进行数据图像绘制。 一幅数据图基本上包括如下结构:

  1. Data: 数据区,包括数据点、描绘形状
  2. Axis: 坐标轴,包括 X 轴、 Y 轴及其标签、刻度尺及其标签
  3. Title: 标题,数据图的描述
  4. Legend: 图例,区分图中包含的多种曲线或不同分类的数据
  5. 其他的还有图形文本 (Text)、注解 (Annotate)等其他描述

详细的结构图如下图所示:

数据绘图基本结构

This figure powered by Snipaste .


绘图分类

Matplotlib API 中提供了常见的绘图类型,常用的包括如下:

  • 常规图:regular plot
  • 直方图:bar plot
  • 散点图:scatter plot
  • 饼状图:pie plot
  • 轮廓图:contour plot
  • 3D图:3D plot
  • 多子图:subplot
  • 显示图片:imshow

参考文献 [3] 详细记录了 API 中的各种类型图的参数说明,不再一一赘述。


画法

本篇以常规图为例,详细记录作图流程及技巧。按照绘图结构,可将数据图的绘制分为如下几个步骤:

  • 导入 matplotlib 包相关工具包
  • 准备数据,numpy 数组存储
  • 绘制原始曲线
  • 配置标题、坐标轴、刻度、图例
  • 添加文字说明、注解
  • 显示、保存绘图结果

先给出一个完整的图结构吧,这个图主要是绘制 cos、sin、sqrt 函数图像,如下:

完整的常规图绘制结果

导包

涉及到 matplotlib.pyplot、pylab 和 numpy,如:

1
2
3
4
5
#coding:utf-8

import numpy as np
import matplotlib.pyplot as plt
from pylab import *

准备数据

numpy 常用来组织源数据:

1
2
3
4
5
# 定义数据部分
x = np.arange(0., 10, 0.2)
y1 = np.cos(x)
y2 = np.sin(x)
y3 = np.sqrt(x)

绘制基本曲线

使用 plot 函数直接绘制上述函数曲线,可以通过配置 plot 函数参数调整曲线的样式、粗细、颜色、标记等:

1
2
3
4
5
6
# 绘制 3 条函数曲线
plt.plot(x, y1, color='blue', linewidth=1.5, linestyle='-', marker='.', label=r'$y = cos{x}$')

plt.plot(x, y2, color='green', linewidth=1.5, linestyle='-', marker='*', label=r'$y = sin{x}$')

plt.plot(x, y3, color='m', linewidth=1.5, linestyle='-', marker='x', label=r'$y = \sqrt{x}$')

1> color 参数

包含基本的红(red, r)、绿(green, g)、蓝(blue, b)、黑(k)、青色(c)、洋红色(m)、黄色(y)、白色(w)及其衍生色,还可以使用 6 个 16 进制数表示(如,’#FF00CC’, ‘#ff00ff’)。

color 样式图

color 参数图片由参考文献 [1] 提供。

2> linestyle 参数

其中,linestyle 参数主要包含虚线、点化虚线、粗虚线、实线,表示符号见下图:

linestyle 参数图片由参考文献 [1] 提供。

3> marker 参数

在曲线上标记特殊的符号,以区分不同的线段,比较实用。常见的形状及表示符号如下图所示:

marker 样式图

marker 参数图片由参考文献 [1] 提供。

设置坐标轴

可通过如下代码,移动坐标轴 spines,解说详见注释:

1
2
3
4
5
6
7
8
9
10
11
12
# 坐标轴上移
ax = plt.subplot(111)
ax.spines['right'].set_color('none') # 去掉右边的边框线
ax.spines['top'].set_color('none') # 去掉上边的边框线

# 移动下边边框线,相当于移动 X 轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))

# 移动左边边框线,相当于移动 y 轴
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

可通过如下代码,设置刻度尺间隔 lim、刻度标签 ticks

1
2
3
4
5
6
7
8
# 设置 x, y 轴的刻度取值范围
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(-1.5, 4.0)

# 设置 x, y 轴的刻度标签值
plt.xticks([2, 4, 6, 8, 10], [r'2', r'4', r'6', r'8', r'10'])
plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
[r'-1.0', r'0.0', r'1.0', r'2.0', r'3.0', r'4.0'])

可通过如下代码,设置 X、Y 坐标轴和标题:

1
2
3
4
# 设置标题、x轴、y轴
plt.title(r'$the \ function \ figure \ of \ cos(), \ sin() \ and \ sqrt()$', fontsize=19)
plt.xlabel(r'$the \ input \ value \ of \ x$', fontsize=18, labelpad=88.8)
plt.ylabel(r'$y = f(x)$', fontsize=18, labelpad=12.5)

设置文字描述、注解

可通过如下代码,在数据图中添加文字描述 text

1
2
plt.text(4, 1.68, r'$x \in [0.0, \ 10.0]$', color='k', fontsize=15)
plt.text(4, 1.38, r'$y \in [-1.0, \ 4.0]$', color='k', fontsize=15)

// 其中,r’$…$’ 语句表示使用 LaTex 公式符号,LaTex 公式符号见参考文献 [5].

可通过如下代码,在数据图中给特殊点添加注解 annotate

1
2
3
4
# 特殊点添加注解
plt.scatter([8,],[np.sqrt(8),], 50, color ='m') # 使用散点图放大当前点

plt.annotate(r'$2\sqrt{2}$', xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.1', color='#090909'))

设置图例

可使用如下两种方式,给绘图设置图例:
1: 在 plt.plot 函数中添加 label 参数后,使用 plt.legend(loc=’up right’)
2: 不使用参数 label, 直接使用如下命令:

1
plt.legend(['cos(x)', 'sin(x)', 'sqrt(x)'], loc='up right')

loc 参数表示图例的位置,常见的位置参数如下:

legend loc 参数

legend loc 参数图片由参考文献 [2] 提供。

网格线开关

可使用如下代码,给绘图设置网格线:

1
2
# 显示网格线
plt.grid(True)

显示、保存

1
2
plt.show()    # 显示
# savefig('../figures/plot3d_ex.png',dpi=48) # 保存,前提目录存在

本例完整代码已上传 github:

plot.py

显示中文

默认的编程环境无法显示中文字符,这里提供一种方法,添加如下配置代码:

1
2
3

plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号

其他图画法

按照类型图的分类,下文简要记录一下直方图的基础代码,其他,如散点图、饼状图、轮廓图、3D图、多子图等从参考文献 [1] 获取。

直方图

直方图,也即柱状图,使用 bar API 进行绘制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#coding:utf-8

import numpy as np
import matplotlib.pyplot as plt
from pylab import *

x_size = [1, 3, 5, 7, 9, 11, 13]
y_time_point = [0, 200, 415, 628, 714, 862, 0]

x_zhe = [3, 5, 7, 9, 11]
y_zhe = [200, 415, 628, 714, 862]

# 设置刻度标签
plt.xticks(x_zhe, (u"3", u"5", u"7", u"9", u"11"))

# 绘制柱状图
plt.bar(left = (x_size), height = (y_time_point), width = 1.0,
align="center", facecolor = 'lightskyblue',edgecolor = 'white')

# 添加文本解释
for x, y in zip(x_zhe, y_zhe):
plt.text(x, y+10, '%.0f' % y, ha='center', va= 'bottom')

#设置y轴范围
ylim(0, 1000)

# 画折线图
plt.plot(x_zhe, y_zhe, 'y.-')
plt.title('Time values change with Size')
plt.xlabel('Size')
plt.ylabel('Time (s)')
plt.grid(True)
plt.show()

以上代码可以得到如下直方图:

直方图

参考文献

[1] http://www.labri.fr/perso/nrougier/teaching/matplotlib/#beyond-this-tutorial
[2] http://www.bioinfo.org.cn/~casp/temp/spring.lecture/Matplotlib_slides.pdf
[3] http://matplotlib.org/api/pyplot_api.html
[4] http://python.jobbole.com/85106/
[5] http://mohu.org/info/symbols/symbols.htm


声明

转载请注明作者和出处,禁止一切商业用途!

END


Enjoy it ? Donate me ! 求鼓励,求支持!
0%