TOC
KINA

KINA-0

Start having fun with KINA right now!

Matplotlib绘图库pyplot模块简介

Matplotlib是Python的一个2D图形库,能够生成各种格式的图形,且生成图形质量较高。pyplot是Matplotlib的一个模块,使得Matplotlib的使用方式类似于MATLAB,常在深度学习中用于数据可视化。

官网:matplotlib.org
源代码:github matplotlib

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 若在jupyter notebook中运行,可添加如下的魔术命令,使图形在展示时嵌入Out[]中
%matplotlib inline

# 要显示高清矢量图,还需进行如下设置
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

1 快速入门

1.1 绘制图像

通过函数plt.figure()创建图形窗口(figure),使用绘图函数(如plot())绘制线型图

fig1 = plt.figure()         # 创建新图窗
x = [1, 2, 3, 4, 5]         # 数据的x值
y = [1, 5, 19, 52, 137]     # 数据的y值
plt.plot(x, y)              # plot函数:先描点,再连线

绘制图像

1.2 保存图像

使用方法.savefig()保存图像,具体参数如下:

fig1.savefig(fname, dpi=None, format=None, **kwargs)
  • filename:要保存的文件名(绝对路径或相对路径)
  • dpi:可选参数,指定分辨率,默认为None,即使用默认分辨率
  • format:可选参数,指定保存的图像格式。若未指定则根据文件扩展名自动推断
  • kwargs:其他可选参数,用于传递给底层图像库的选项

可保存为eps、jpg、pdf、png、ps、svg等格式,建议用svg矢量格式,例如

fig1.savefig(r'/Users/Example/Pictures/my_pic.jpg')

1.3 两种画图方式

Matplotlib中有两种画图方式:Matlab方式面向对象方式。两种方式通常可以相互转化。

1.1中的绘图操作为Matlab方式,如下所示

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)

面向对象方式中,用函数plt.axes()返回坐标轴(axes),其调用绘图方法(如.plot())来进行相似的绘图操作

# 面向对象方式
fig1 = plt.figure()
ax1 = plt.axes()
ax1.plot(x, y)

2 多图绘制

画一幅图需在一个代码块内完成,不得分块。

# 准备数据
x = [1, 2, 3, 4, 5]
y1 = [1, 2, 3, 4, 5]
y2 = [0, 0, 0, 0, 0]
y3 = [-1, -2, -3, -4, -5]

2.1 绘制多线条

在同一个图窗内绘制多线条

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
# 面向对象方式
fig1 = plt.figure()
ax1 = plt.axes()
ax1.plot(x, y1)
ax1.plot(x, y2)
ax1.plot(x, y3)

绘制多线条

2.2 绘制多子图

在不同图窗内显示每条曲线

Matlab方式中,使用函数plt.subplot(nrows, ncols, index, **kwargs)创建指定位置的子图,紧接其后进行绘图操作

# Matlab方式:
fig1 = plt.figure()
plt.subplot(3, 1, 1), plt.plot(x, y1)
plt.subplot(3, 1, 2), plt.plot(x, y2)
plt.subplot(3, 1, 3), plt.plot(x, y3)

面向对象方式中,可用函数plt.subplots(nrows=1, ncols=1, ...)返回图窗和一系列子图,代替了plt.figure()plt.axes()

# 面向对象方式
fig1, ax1 = plt.subplots(3)
ax1[0].plot(x, y1)
ax1[1].plot(x, y2)
ax1[2].plot(x, y3)

绘制多子图


3 图表类型

详见https://matplotlib.org/stable/plot_types/index

matplotlib提供5类基本图表:二维图、网格图、统计图、轮廓图、三维图。常用的图表函数如下所示

3.1 二维图

二维图

二维图需要两个向量来绘图,以下仅演示plot()线型图函数

# 准备数据
x = [1, 2, 3, 4, 5]
y1 = [0, 1, 2, 3, 4]
y2 = [1, 2, 3, 4, 5]
y3 = [2, 3, 4, 5, 6]
y4 = [3, 4, 5, 6, 7]
y5 = [4, 5, 6, 7, 8]

线型图通过设置以下属性,可替代其它所有二维图

3.1.1 设置颜色

plot()函数的color参数可以设置线条的颜色

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, color='#7CB5EC')
plt.plot(x, y2, color='#F7A35C')
plt.plot(x, y3, color='#A2A2D0')
plt.plot(x, y4, color='#F6675D')
plt.plot(x, y5, color='#47ADC7')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, color='#7CB5EC')
ax1.plot(x, y2, color='#F7A35C')
ax1.plot(x, y3, color='#A2A2D0')
ax1.plot(x, y4, color='#F6675D')
ax1.plot(x, y5, color='#47ADC7')

设置颜色

3.1.2 设置风格

plot()函数的linestyle参数可以设置线条的风格:-表示实线,--表示虚线,-.表示点虚线,:表示点线, 表示隐藏该线条

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, linestyle='-')
plt.plot(x, y2, linestyle='--')
plt.plot(x, y3, linestyle='-.')
plt.plot(x, y4, linestyle=':')
plt.plot(x, y5, linestyle='')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, linestyle='-')
ax1.plot(x, y2, linestyle='--')
ax1.plot(x, y3, linestyle='-.')
ax1.plot(x, y4, linestyle=':')
ax1.plot(x, y5, linestyle='')

设置风格

3.1.3 设置粗细

plot()函数的linewidth参数可以设置线条的粗细,数字表示磅数,一般以0.5~3为宜。

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, linewidth=0.5)
plt.plot(x, y2, linewidth=1)
plt.plot(x, y3, linewidth=1.5)
plt.plot(x, y4, linewidth=2)
plt.plot(x, y5, linewidth=2.5)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, linewidth=0.5)
ax1.plot(x, y2, linewidth=1)
ax1.plot(x, y3, linewidth=1.5)
ax1.plot(x, y4, linewidth=2)
ax1.plot(x, y5, linewidth=2.5)

设置粗细

3.1.4 设置标记

plot()函数的marker参数可以设置线条的标记,标记的尺寸由markersize参数调整,其值以 3 至 9 为宜

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, color='#7CB5EC', linestyle='-', linewidth=2, marker='o', markersize=6)
plt.plot(x, y2, color='#F7A35C', linestyle='--', linewidth=2, marker='^', markersize=6)
plt.plot(x, y3, color='#A2A2D0', linestyle='-.', linewidth=2, marker='s', markersize=6)
plt.plot(x, y4, color='#F6675D', linestyle=':', linewidth=2, marker='D', markersize=6)
plt.plot(x, y5, color='#47ADC7', linestyle=' ', linewidth=2, marker='o', markersize=6)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, color='#7CB5EC', linestyle='-', linewidth=2, marker='o', markersize=6)
ax1.plot(x, y2, color='#F7A35C', linestyle='--', linewidth=2, marker='^', markersize=6)
ax1.plot(x, y3, color='#A2A2D0', linestyle='-.', linewidth=2, marker='s', markersize=6)
ax1.plot(x, y4, color='#F6675D', linestyle=':', linewidth=2, marker='D', markersize=6)
ax1.plot(x, y5, color='#47ADC7', linestyle=' ', linewidth=2, marker='o', markersize=6)

设置标记

3.2 网格图

网格图

网格图需要一个矩阵来绘图,以下仅演示imshow()函数

# 准备数据 
x = np.linspace(0,10,1000)
I = np.sin(x) * np.cos(x).reshape(-1,1)

Matlab方式中可以配置颜色条,面向对象方式无此功能

# Matlab方式
fig1 = plt.figure()
plt.imshow(I)
plt.colorbar()      # 设置颜色条

Matlab方式中可以配置颜色条

# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.imshow(I)

面向对象方式无此功能

3.3 统计图

统计图

统计图一般做数据分析时使用,以下仅演示hist()函数

# 创建10000个标准正态分布的样本
data = np.random.randn(10000)

对生成的直方图求积分,结果即为个体总数,即10000。

# Matlab方式
fig1 = plt.figure()
plt.hist(data)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data)

直方图

3.3.1 区间个数

hist()函数的bins参数为区间划分的数量,默认为10

# Matlab方式
fig1 = plt.figure()
plt.hist(data, bins=30)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, bins=30)

区间个数

3.3.2 透明度

hist()函数的alpha参数表示透明度,默认为1

# Matlab方式
fig1 = plt.figure()
plt.hist(data, alpha=0.5)
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, alpha=0.5)

透明度

3.3.3 图表类型

hist()函数的histtype属性表示类型,默认为bar,可改为stepfilled,使图形浑然一体

# Matlab方式
fig1 = plt.figure()
plt.hist(data, histtype='stepfilled')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, histtype='stepfilled')

图表类型

3.3.4 直方图颜色

hist()函数的color属性表示直方图的颜色

# Matlab方式
fig1 = plt.figure()
plt.hist(data, color='#A2A2D0')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, color='#A2A2D0')

直方图颜色

3.3.5 边缘颜色

hist()函数的edgecolor表示直方图边缘的颜色

# Matlab方式
fig1 = plt.figure()
plt.hist(data, bins=30, alpha=0.5, color='#7CB5EC', edgecolor='#FFFFFF')
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.hist(data, bins=30, alpha=0.5, color='#7CB5EC', edgecolor='#FFFFFF')

边缘颜色


4 图窗属性

4.1 坐标轴上下限

手动设置坐标轴上下限的各种方法如下

# 准备数据 
x = [1, 2, 3, 4, 5]       # 数据的 x 值
y = [1, 8, 27, 64, 125]   # 数据的 y 值

4.1.1 lim法

Matlab方式中通过plt.xlim()plt.ylim()函数来修改x、y轴坐标上下限,如下所示

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)
plt.xlim(1, 5)
plt.ylim(1, 125)

面向对象方式中则使用对应的以.set_开头的方法来设置

# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_xlim(1, 5)
ax1.set_ylim(1, 125)

lim法

4.1.2 axis法

使用函数plt.axis()进行设置,所传序列中元素应对应各轴上下限,注意观察
还可使用plt.axis('equal'),使得x轴与y轴的比例达到1:1,长度等长

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)
plt.axis([1, 5, 1, 125])
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.axis([1, 5, 1, 125])

axis法

4.2 标题与轴名称

使用4.1中的数据

Matlab方式使用plt.title()plt.xlabel()plt.ylabel()函数来修改各属性

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y)
plt.title("For Example")
plt.xlabel("x")
plt.ylabel("y")

面向对象方式中则使用对应的以.set_开头的方法来设置(参考4.1.1)
统一设置:ax1.set(xlim=(), ylim=(), title=' ', xlabel=' ', ylabel=' ')

# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("For Example")
ax1.set_xlabel("x")
ax1.set_ylabel("y")

# ax1.set(...)

标题与轴名称

4.3 图例

一般在二维图与统计图中使用图例,网格图中则用颜色条。

# 准备数据 
x = [1, 2, 3, 4, 5]
y1 = [1, 2, 3, 4, 5]
y2 = [0, 0, 0, 0, 0]
y3 = [-1, -2, -3, -4, -5]

plt.legend(**kwag)函数显示图例,有3个常用关键字参数:

  • loc:图例位置,可取值为upper/center/lowerleft/center/right中各取1个的组合,也可为best。默认在角落。
  • frameon:是否显示图例边框,默认为True。
  • ncol:图例的列数,默认为1。

有以下两种显示方式,结果基本一致:

  • 法1:通过给绘图函数传入label属性来设置曲线在图例中的名称,再使用legend()显示
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1, label='y=x')
plt.plot(x, y2, label='y=0')
plt.plot(x, y3, label='y=-x')
plt.legend()
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1, label='y=x')
ax1.plot(x, y2, label='y=0')
ax1.plot(x, y3, label='y=-x')
ax1.legend()
  • 法2:给legend()传入一个列表,列表中每个元素对应于每条曲线的图例
# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.legend(['y=x', 'y=0', 'y=-x'])
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1)
ax1.plot(x, y2)
ax1.plot(x, y3)
ax1.legend(['y=x', 'y=0', 'y=-x'])

图例

4.4 网格

grid()显示网格,亦可以设置colorlinestyle参数(同plot()中的用法)

# Matlab方式
fig1 = plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.grid()
# 面向对象方式
fig1, ax1 = plt.subplots()
ax1.plot(x, y1)
ax1.plot(x, y2)
ax1.plot(x, y3)
ax1.grid()

网格

发表评论