作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119255863
目录
第2章 matplotlib图的组成元素与构图 - 面向对象式绘图
第5章 在默认figure上绘制多张默认坐标系的子图:subplot()
第1章 函数可视化工具matplotlib
在深度学习模型中,经常需要通过图形化的方式展现输出变量与输出变量之间的可视化关系。
matplotlib画图工具,是一个非常不错的选择。
1.1 Matplotlib简介
Matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包
它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案,用于可视化NumPy生成的各种数据序列。
它也可以和图形工具包一起使用,如 PyQt 和 wxPython。
1.2 库名
import numpy as np
import matplotlib.pyplot as plt
1.3 主页
https://www.runoob.com/numpy/numpy-matplotlib.html
1.4 matplotlib能绘制什么图
(1)一维的数轴
(2)二维平面的曲线、散点、柱状图等
(3)三维立体的曲线、散点柱状图
(4)三维立体的曲面图
(5)高维曲线、曲面
本文重点放在matplotlib的基本原理以及二维平面曲线图形的绘制。至于三维线和面的绘制,再单独讲解。
1.5 Matplotlib绘图的两种基本方式
(1)函数式绘图:通过通用的接口函数,创建和操作图。
(2)面向对象式绘图:通过构建图中的各个元素对象,并通过每个元素对象的成员函数进行绘图。
1.6 Matplotlib构图的两种方式
(1)隐式构图
当需要绘制一张简单的图形时,可以使用隐式构图,比如:
- 只包含一个默认的坐标系子图
- 子图是默认的二维直角坐标系
(2)显式构图:
当需要构建一张复杂的图形的时候,就需要进行显式的方式进行构图,比如:
- 构建一个三维图形。
- 构建包含多张子图的图形。
第2章 matplotlib图的组成元素与构图 - 面向对象式绘图
使用matplotlib绘图时,必须理解画布(figure),区域(axe)和坐标轴(axis)这些基础与核心概念。
2.1 Artist(艺术品)对象
基本上,图上的所有组成元素对象都是一个Artist对象,包括Figure对象、Axes对象和Axis对象,可以将Artist理解为一个基类。所有的artist对象都会绘制于canvas画布上。
通过组织、操作这些对象,可以定制化一张图的所有元素。
2.2 figure:画布canvas
整个图形即是一个Figure对象,即一个弹出的绘图的窗口,便是一个figure。
Figure对象至少包含一个坐标系子图,也就是Axes对象。
Figure对象包含一些Artist对象,如title标题、图例legend。
Figure对象包含画布canvas对象。 canvas对象一般不可见,通常无需直接操作该对象,matplotlib程序实际绘图时需要调用该对象
在import matplotlib.pyplot时,会自动建立一个默认的figure对象。
可以通过下述方式获取figure对象
fig = plt.figure() #创建并获取当前默认的figure对象。
2.3 axes:子图坐标系
字面上理解,axes是数据轴axis的复数形式,即由多个数轴组成的坐标系,每个坐标系称为一个子图sub-plot,也就说每一个子图坐标系都有多个坐标轴组成,如x和y轴,z轴等等。默认情况下是二维的直角坐标系,有x轴和y轴组成。每个坐标系可以绘制一个数学图形。
坐标系的种类很多,常用的坐标系有:笛卡尔直角坐标系、平面极坐标系、柱面坐标系(或称柱坐标系)和球面坐标系(或称球坐标系)等。
常见的坐标系是:
在import matplotlib.pyplot时,会自动建立一个默认的二维直角坐标系的对象。并自动把该直角坐标系与默认的figure对象关联起来。
可以通过下述方式创建figure上的坐标轴对象。
- ax1 = plt.axes() # 在默认的figure上,创建默认的二维直角坐标轴。
- ax2 = plt.axes(projection='3d') # 在默认的figure上,创建默认的三维直角坐标轴。
- Ax3 = Axes3D(fig) # 建立三维坐标轴,并建立与指定figure对象的关联。
还可以使用如下的方法设置坐标系子图的属性参数:
set_xlim()以及set_ylim():设置子图x轴和y轴对应的数据范围。
set_title():设置子图的标题。
set_xlabel()以及set_ylable():设置子图x轴和y轴指标的描述说明。
2.4 axis:坐标轴
在一个坐标系中,包括多个维度的坐标轴,每个坐标轴代表一个维度。
坐标轴的维度与向量的维度、张量的维度是一致的。
每个坐标轴都有对应的Axis是数据轴对象,主要用于控制数据轴上刻度位置和显示数值。
Axis有Locator和Formatter两个子对象,分别用于控制刻度位置和显示数值。
2.5 其他对象
legend(图例)
Major tick(大标尺刻度)
Minor tick(小标尺刻度)
Major tick label(大标尺刻度数值)
Minor tick label(小标尺刻度数值)
Y axis label(y轴指标说明)
X axis label(x轴指标说明)
Line(线型图)
Markers(数据标注点)
Grid(格子)等等
第3章 函数式绘图
3.1 概述
为了简化对图元素的控制,matplotlib提供了一些基本的函数,用来创建一张图、自动构建图的元素以及设置图元素的属性值。
3.2 绘图函数的分类
在matplotlib.pyplot里是封装好的函数,用户可以直接调用函数进行绘图。
一般的,我们约定 matplotlib.pyplot 取别名为 plt.
plt模块/对象主要包含两大类的函数:
(1)操作类的函数:
对画布,图,子图,坐标轴,图例,背景,网格等对象的属性进行操作。
如:plt.ylabel(), plt.xlabel(), plot.yscale(), plt.legend(), plt.title(), plt.text()
这些函数反映了可以设置图形的哪些属性和参数。
(2)绘图类的函数:
把输入数据,进行可视化绘图,不同类型的图形,有不同的绘制函数:折线图,散点图,条形图,直方图,饼状图,如:plt.scatter(), plt.plot(), plt.bar(), plot.pie(), plt.hise()
这些函数同时反映了matplotlib能够画哪些类型的图形。
3.3 函数式绘图的优缺点:
(1)缺点:定制化弱
- 定制化弱:其实函数式的绘图本质上还是在matplotlib对象的封装,在对象的基础上多了一层函数的调用,其定制性并不是很强,都是封装好的函数。
(2)优点:简单
- 简单:适合一般用户绘图,要求不是很高,定制性不是很强的绘图。直接使用默认创建的对象,新手容易上手,不需要了解画图模块内部的对象。
第4章 通过隐式+函数式的方式绘制图形
4.1 隐式构图的情形
当需要绘制一张简单的图形时,可以使用隐式构图,比如:
- 只包含一个默认的坐标系子图
- 子图是默认的二维直角坐标系
4.2 隐式构图的基本原理
隐式构图不需要程序员显式地先创建figure对象和axes坐标系对象,可以直接调plt.xxx()函数进行绘图。此时,matplotlib系统会自己会判断是否已经有了figure对象和axes坐标系对象,如果没有,系统会自动创建一个figure对象,然在后次基础上创建axes坐标系对象,并对他们进行关联。
优势:
使用隐式构图的优势是简单、方便,如果只是绘制一个小图形,那么直接使用plt.xxx()绘图函数的方式,会自动帮我们创建一个figure对象和一个axes坐标系,plt.xxx()绘图函数会把图形制在这个默认的figure对象和一个axes坐标系。
劣势:
缺点也是很明显的:不能绘制复杂的构图,如构建一个三维图形和构建包含多张子图的图形,隐式构图就无法实现。因为我们想要在一个figure对象上,绘制多个子图形,那么我们就必须拿到每个axes对象,然后调用每个位置上的axes对象,就可以在每个对应位置的坐标系上,然后 隐式构图根本拿不到这些axes对象。这时候就需要采用显式的方式构图了。
4.3 隐式构图案例1:画单张实线图(plot)
实例1:
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11) #生成1-11的整数值序列
y = 2 * x + 5 #根据x序列,生成y序列
plt.title("Matplotlib demo") #设置图y轴的title
plt.xlabel("x axis caption") #设置图y轴的label
plt.ylabel("y axis caption") #设置图y轴的label
plt.plot(x,y) #用(x,y)序列构建图
plt.show() #显示图
以上实例中,
np.arange() 函数创建 x 轴上的值。
y 轴上的对应值存储在另一个数组对象 y 中。
这些值使用 matplotlib 软件包的 pyplot 子模块的 plot() 函数绘制。
图形由 show() 函数显示。
实例2:
import numpy as np
import matplotlib.pyplot as plt
# 计算正弦曲线上点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x) #正弦关系
plt.title("sine wave form")
plt.plot(x, y) # 使用 matplotlib 来绘制点,构图
plt.show() # 显示图,画图
执行输出结果如下图:
4.5 隐式构图案例2:画单张散点图(scatter)
实例3:
import numpy as np
from matplotlib import pyplot as plt
x = np.arange(1,11) #生成1-11的整数值序列
y = 2 * x + 5 #根据x序列,生成y序列
plt.title("Matplotlib demo") #设置图y轴的title
plt.xlabel("x axis caption") #设置图y轴的label
plt.ylabel("y axis caption") #设置图y轴的label
plt.scatter(x,y) #用(x,y)序列构建散点图
plt.show() #显示图
4.3 隐式构图案例3:画单张柱状图/条形图(bar)
pyplot 子模块提供 bar() 函数来生成条形图。
以下实例生成两组 x 和 y 数组的条形图。
from matplotlib import pyplot as plt
x1 = [5,8,10]
y1 = [12,16,6]
x2 = [6,9,11]
y2 = [6,15,7]
plt.bar(x1, y1, align = 'center') #在主画布上构建图1
plt.bar(x2, y2, color = 'g', align = 'center') #在主画布上构建图2
plt.title('Bar graph')
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()
结果:
第5章 在默认figure上绘制多张默认坐标系的子图:subplot()
5.1 subplot()功能概述
subplot() 函数允许在默认的figure画布中绘制多个不同的默认坐标系的子图。
5.2 subplot绘制方法
要在一个画布中绘制多个子图subplot,就需要对整个画布进行区间切分,划分子图。
备注:
subplot同一个画布上绘制多个子图,而不是在一个子图中绘制多个图形。
- 一个画布上绘制多个子图
- 一个子图中绘制多个图形
(3)切分规则
按照行和列的方式,把整个画布切分成n*m个区域,每个区域同一个代号表示,如下图所:
备注:
- 切分规则把“整个画布”切分成n*m个矩阵区域
- 每个子图,对整个画布的切分规则可以不相同。如某个子图按照2*3的方式切分整个“画布”,另一个子图按照3*1的方式切分整个画布。
(4)子图标识号
- 每个子图,需要制定切分画布的规则,同时还需要指明子图,在该切分规则下,处于矩阵中的位置。也就是子图的位置号。
- 位置号从1开始,从左向右,从上之下进行编号。
(5)函数 原型:subplot(numbRow , numbCol ,plotNum )
- numbRow:指明画布被切分为多少行
- numbCol :指明画布被切分为多少列
- plotNum :指明子图在切分后的空间中的位置。
5.3 画图源代码案例
import numpy as np
import matplotlib.pyplot as plt
# 计算正弦和余弦曲线上的点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.3)
y_sin = np.sin(x)
# 把画布切分2*3的网格,切换第1个网格
ax1 = plt.subplot(2, 3, 1)
# 在网格1中构建子图
ax1.set_title('A')
ax1.set_xlabel("X")
ax1.set_ylabel("Y")
ax1.plot(x, y_sin)
# 把画布切分2*3的网格,切换第2个网格
ax2 = plt.subplot(2, 3, 2)
# 在网格2中构建子图
ax2.bar(x, y_sin)
ax2.set_title('B')
ax2.set_axis_off()
# 把画布切分2*3的网格,切换第3个网格
ax3 = plt.subplot(2, 3, 3)
# 在网格2中构建子图
ax3.scatter(x, y_sin)
ax3.set_title('C')
# 把画布切分2*1的网格,切换第2个网格
plt.subplot(2, 1, 2)
# 使用默认的对象画图
plt.title("D")
plt.xlabel("X")
plt.ylabel("Y")
plt.plot(x, y_sin)
# 展示图像
#plt.show()
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119255863