数据分析与可视化基础 (3) :Matplotlib绘图库

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

数据分析与可视化基础 (1) :NumPy数组库
数据分析与可视化基础 (2) :Pandas标签库
数据分析与可视化基础 (3) :Matplotlib绘图库



1 快速入门

# 若在jupyter notebook中运行,可添加如下的魔术命令,使图形在展示时嵌入Out[]中
%matplotlib inline
# 要显示高清矢量图,还需进行如下设置
from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')

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()      # 设置颜色条

在这里插入图片描述

# 面向对象方式
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)

在这里插入图片描述

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])

在这里插入图片描述

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()

在这里插入图片描述

  • 37
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Akira37

💰unneeded

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值