第十章 Matplotlib绘图方法

1.介绍

Matplotlib是一个很常用的python绘图库,它可以带着我们轻松地绘制各种图形,包括曲线图,折线图,条形图,饼图和3D图等。为什么要学这个呢,因为我们人工智能的数据结果必须要通过图形才能直观显示,学习Matplotlib可以帮我们通过图像更好的分析实验结果。
我们用清华的镜像安装Matplotlib会更快一些:
在对应环境的命令行输入(你可以直接在pytorch环境的Pycharm终端输入):

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

这样就可以啦:
在这里插入图片描述
如果出错,那么可能是镜像源关闭了,直接输入pip install matplotlib,虽然慢点,但是不会错。

2.图像的绘制

1.介绍
在用Matplotlib画图时,我们最常用的是matplotlib.pyplot接口,所以可以一开始起个别称叫做plt,方便我们后面绘制图像:

import matplotlib.pyplot as plt

2.散点图
要画一个图像并且显示很简单,我们这样以散点图为例:
(1)首先我们需要指定一下显示的点x坐标和y坐标,但是这样要注意的是,这个x和y是分开用列表写的,就像这样:

x = [0, 1, 3, 6]
y = [1, 3, 5, 7]

这里一共写了四个点,分别是(0,1)(1,3)(3,5)(6,7),所以也就要求x和y的列表大小必须一样。用列表分开来装可以方便我们通过循环生成大量的点。
(2)有了x和y的坐标值以后,我们只需要把它传入创建散点图的函数就行:

plt.scatter(x, y)
plt.show()

注意,这里的scatter已经绘制好并且显示图像了,后面的show和opencv的imshow不一样,plt.show起到的是暂停屏幕的作用,相当于之前的cv.waitKey(0)。
完整代码如下:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt

x = [0, 1, 3, 6]
y = [1, 3, 5, 7]

plt.scatter(x, y)
plt.show()

输出为:
在这里插入图片描述
3.图像的其他参数
每个图像都有很多的参数可以让用户自定义,我们还是以散点图的为例,这是其代码里面写的参数:
@_copy_docstring_and_deprecators(Axes.scatter) def scatter(x: Any,
y: Any,
s: Any = None,
c: Any = None,
marker: Any = None,
cmap: Any = None,
norm: Any = None,
vmin: Any = None,
vmax: Any = None,
alpha: Any = None,
linewidths: Any = None,
*,
edgecolors: Any = None,
plotnonfinite: bool = False,
data: Any = None,
**kwargs: Any) -> Any
其中的四个参数很常用,其他的保持默认即可:
(1)s:控制点的大小(输入一个想要的数字)
(2)c:c就是color颜色,默认是蓝色,你可以输入RGB值对应的数字(可以百度一下),也可以输入常用颜色的名称,比如yellow。平时默认是blue。而且你可以输入多个颜色来对应多个点(比如有四个点,你可以输入一个有四个值的元组,但是要注意的是,要么是一个数字,要么就是要和点数对应的多个数字)
(3)maker:这个是点的形状,具体有哪些形状大家可以百度一下,比如: ∗ * 是五角星的意思。
(4)alpha:这个是点的透明度。
比如刚刚的图像改一下:

@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time2023/3/16 13:46
"""
import matplotlib.pyplot as plt

x = [0, 1, 3, 6]
y = [1, 3, 5, 7]

plt.scatter(x=x, y=y, s=300, c=(210, 220, 123, 1), marker="*", alpha=0.6)  # 这个颜色是我乱输入的
plt.show()

输出为:
在这里插入图片描述
4. 快速的生成点的坐标
像之前那样一点点地定义点的坐标很麻烦,有时候我们的x轴的坐标,我们就希望是按照[1, 2, 3, 4…]这样的排列顺序来进行排列的(y轴就是你的输出,所以视情况而定)。那要如何快速生成x轴的坐标呢?我们使用linspace()接口就行,而且这个接口在numpy和pytorch里面都有,唯一的区别就是Numpy返回的是Ndarray类型的数组,而pytorch返回的是一个tensor类型的张量,但这是无所谓的,plt都可以识别。代码如下:

np.linspace(起点,终点,数目)
torch.linspace(起点,终点,数目)

各个参数的含义是:
(1)起点:起点的数字;
(2)终点:终点的数字;
(3)数目:需要生成几个点;
(4)每个点间的间隔是: 间隔 = 终点 − 起点 数目 间隔=\frac{终点-起点}{数目} 间隔=数目终点起点
以生成一个sin()曲线为例:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-np.pi, np.pi, 30)  # 从-Π到Π的30个点
y = np.sin(x)   # 传入的是数组返回也是数组

plt.scatter(x, y, c='black', marker="*")
plt.show()

其中的np.pi就是 π \pi π的意思,对np.sinx()函数传入一个数组,它就会计算其中每一个数字的sin值并且返回对应数组,接下来传入散点图即可。
输出如下:
在这里插入图片描述
换成torch也是一样的:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

x = torch.linspace(-np.pi, np.pi, 30)  # 从-Π到Π的30个点
y = np.sin(x)   # 传入的是数组返回也是数组

plt.scatter(x, y, c='black', marker="*")
plt.show()

5.曲线图:
曲线图和散点图用法几乎一样,只不过其样式的参数不一样:

plt.plot(x, y, c, lw, ls, marker)

其中:c,lw,ls并不在这个位置,所以必须要先声明,不然只能用默认值。
(1)c和之前一样是颜色;
(2)lw是线条的宽度;
(3)ls是线条的样式,比如ls="–"是虚线。
(4)marker:还是点的样式,如果设置了它,则运行时会把点标出。
就拿刚刚的sin图来画一下:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

x = torch.linspace(-np.pi, np.pi, 30)  # 从-Π到Π的30个点
y = np.sin(x)   # 传入的是数组返回也是数组

plt.plot(x, y, c='black', marker="*")
plt.show()

输出
在这里插入图片描述
设置成宽1磅的虚线,不要标点:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

x = torch.linspace(-np.pi, np.pi, 30)  # 从-Π到Π的30个点
y = np.sin(x)   # 传入的是数组返回也是数组

plt.plot(x, y, c='black', lw=1, ls="--")
plt.show()

在这里插入图片描述
6.自定义x轴和y轴的范围和标题:
上面的x轴和y轴的范围是自动生成的,并且没有标题,要设置其实很简单,在设置好曲线以后,下面加上:

plt.xlim((起点,终点))	# 设置x轴
plt.ylim((起点, 终点))	# 设置y轴
plt.xlabel('x轴的标题')	# 设置x的标题
plt.ylabel('y轴的标题')	# 设置y的标题

用刚刚的图举例:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

x = torch.linspace(-np.pi, np.pi, 30)  # 从-Π到Π的30个点
y = np.sin(x)   # 传入的是数组返回也是数组

plt.plot(x, y, c='black', lw=1)
plt.xlim((-10, 10))
plt.ylim((-11, 11))
plt.xlabel(u"x")
plt.ylabel(u"sin(x)")
plt.show()

遗憾的是lable也不支持中文,输入中文会报错,只能写英文,这是结果
在这里插入图片描述
要注意,如果图不在x轴的范围它就看不见了
在这里插入图片描述

但你可以用下面的拖动标拖回来。
在这里插入图片描述
7.自定义边框和坐标轴:
我们可以自定义边框和坐标轴的颜色,位置,包括坐标轴的数字显示的位置:
(1)首先必须要先获取边框的变量,我们叫它ax,用gca函数获取:

ax = plt.gca()

(2)边框(其中有两个边框是坐标轴,不明白的看看上面的图,左边和下边的边框是坐标轴)颜色:

ax.spines['边框'].set_color('颜色')

这里的“边框”有四个:“right”,“left”,“top”,“bottom”。
颜色可以是数字,也可以是red等英文,还可以为none表示透明。
(3)位置:

ax.spines["边框"].set_position(('data', 坐标))

前面和颜色一样,后面的set_position需要传入一个元组,"data"是固定的,表示用坐标改位置,坐标可以是数字,比如0表示(0,0)也可以是元组。
(4)坐标轴数字的显示方向,上面的图中是y向左,x向下:

ax.yaxis.set_ticks_position("left或者是right")
ax.xaxis.set_ticks_position("top或者是bottom")

举个例子说明一下,例子中把坐标轴移到了中心,这也是我们最常见的显示方法,注意的是,因为pycharm没有执行,所以它不知道ax是什么,这也导致后面没有代码提示,只能把这几条代码背下来才能灵活运用:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

x = torch.linspace(-np.pi, np.pi, 30)  # 从-Π到Π的30个点
y = np.sin(x)   # 传入的是数组返回也是数组

plt.plot(x, y, c='black', lw=1)
# 获取边框
ax = plt.gca()

# 把x轴和y轴移动到原点
ax.spines["bottom"].set_position(('data', 0))
ax.spines["left"].set_position(('data', 0))

# 把上面和右边的边框透明化:
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")

# 把y轴的值显示到右边
ax.yaxis.set_ticks_position("right")

# 把x轴的值显示到上边
ax.xaxis.set_ticks_position("top")

plt.show()

输出结果为:
在这里插入图片描述
还是把值正常显示看着顺眼:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

x = torch.linspace(-np.pi, np.pi, 30)  # 从-Π到Π的30个点
y = np.sin(x)   # 传入的是数组返回也是数组

plt.plot(x, y, c='black', lw=1)
# 获取边框
ax = plt.gca()

# 把x轴和y轴移动到原点
ax.spines["bottom"].set_position(('data', 0))
ax.spines["left"].set_position(('data', 0))

# 把上面和右边的边框透明化:
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")

# # 把y轴的值显示到右边
# ax.yaxis.set_ticks_position("right")
# 
# # 把x轴的值显示到上边
# ax.xaxis.set_ticks_position("top")

plt.show()

在这里插入图片描述
8.动态绘图:
什么是动态绘图呢,简单来说就是做动画,这样我们可以实时知道数据的变化,一共需要学习四行代码:
(1)打开i交互模块。这样代码不会因为显示而被卡住,一般写在循环前:

plt.ion()

(2)清除当前的图像。在显示下一图之前,我们需要清楚当前的图像,避免重复显示:

plt.cla()

(3)暂停画面。和plt.show()一样,我们需要暂时暂停一下画面,避免一闪而过,但是不能太长,不然会一直占用画面,导致后面的图显示不出来(注意,在i交互模式下,plt.show是失效的),这里是暂停0.1s,一般不要超过0.3s,不然就看着不像动画了。

plt.pause(0.1)

(3)关闭交互模式。当你代码运行结果以后,如果你不希望画面自动关闭,那还是需要拿plt.show()进行画面暂停,但是这之前我们要先关闭i交互模式,on是开那off就是关闭。

plt.ioff()
plt.show()

把上面的改成动图,依靠循环来增加x和y,从而展示动画:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

plt.ion()   # 开启i交互模式
for i in range(60):
    plt.cla()   # 清楚窗口
    x = torch.linspace(-np.pi, np.pi, i)
    y = np.sin(x)
    plt.plot(x, y, c='black', lw=1)
    plt.pause(0.4)  # 暂停画面

plt.ioff()  # 关闭i交互
plt.show()  # 定格最后的画面

在它没有关闭交互模式的时候,即便点了显示框的叉叉也会有另一个跳出来。
具体的运行一下即可,这里就不展示动图了。

3. 扩展:

下面是一些上面没有给出的参数的具体可选值:
1.参数
(1)颜色字符:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,‘#008000’ RGB 颜色符串(也就是上面说的数字),颜色全写有:“red”,“green”,“black”,“orange”,“purple”,“beige”,“cyan”,“magenta”。
(2)线条样式:‘‐’ 实线,‘‐‐’ 破折线,‘‐.’ 点划线,‘:’ 虚线。
(3)点的样式:‘.’ 点标记,‘,’ 像素标记(极小点),‘o’ 实心圈标记,‘v’ 倒三角标记,‘^’ 上三角标记,‘>’ 右三角标记,‘<’ 左三角标记 等等。

2.标题
除了x轴的plr.xlable和y轴的plt.ylable以外,还可以设置图片标题:

plt.title()

用法一样,每一个标题还能设置字体颜色和字体大小,比如:

"""
@FileName:Matplotlib_test.py
@Description:学习如何使用Matplotlib
@Author:段鹏浩
@Time:2023/3/16 13:46
"""
import matplotlib.pyplot as plt
import numpy as np
import torch

x = torch.linspace(-np.pi, np.pi, 100)
y = np.sin(x) + torch.rand(x.size())
plt.scatter(x, y)
plt.title('折线图', size='50', color='#ABCDEF', fontproperties='FangSong')
plt.xlabel('数量', size='15', color='blue', fontproperties='FangSong')
plt.ylabel('价格', size='20', color='m', fontproperties='FangSong')

plt.show()  # 定格最后的画面

输出为:
在这里插入图片描述

注意,标题如果要显示中文的话,需要加上具体的字体设置,用fontproperties定义,对应的字体有:

字体对应名称
黑体SimHei
仿宋FangSong
楷体KaiTi
微软雅黑Microsoft YaHei
新宋体NSimSun
标楷体DFKai-SB
仿宋_GB2312FangSong_GB2312
楷体_GB2312KaiTi_GB2312

loc 参数可以设置标题显示的位置,可以设置为: ‘left’, ‘right’, 和 ‘center’, 默认值为 ‘center’
比如:

plt.title('折线图', size='50', color='#ABCDEF', fontproperties='FangSong', loc="right")

3.在一个画布上画多个图
我们使用subplot(nrows, ncols, index)命令可以一次在画布上画多个图,参数是把画布分为了几行几列,然后对应的图排第几。对于同一个多图,前面的row和cols应该是一样的,只有index不一样,把它写在plt的绘图前就行,比如我们把画布分为一行三列,也就是三个图:

from matplotlib import pyplot as plt
import numpy as np

# plot1
xpoints = np.array([0, 2, 4, 6, 8])
ypoints = np.array([0, 3, 6, 9, 12])
plt.subplot(1, 3, 1)
plt.plot(xpoints, ypoints)
plt.xlabel('x')
plt.ylabel('y')
plt.title('plot1')

# plot2
x = np.array([1, 3, 5, 8])
y = np.array([10, 3, 6, 2])
plt.subplot(1, 3, 2)
plt.plot(x, y)
plt.title('plot2', color='m')

# plot3
x = np.array([1, 6, 7, 8])
y = np.array([10, 3, 6, 2])
plt.subplot(1, 3, 3)
plt.plot(x, y)
plt.title('plot3', color='r')
plt.show()

在这里插入图片描述
可以把三个图放到同一个画布里面:

from matplotlib import pyplot as plt
import numpy as np

# plot1
xpoints = np.array([0, 2, 4, 6, 8])
ypoints = np.array([0, 3, 6, 9, 12])
plt.subplot(1, 1, 1)
plt.plot(xpoints, ypoints)
plt.xlabel('x')
plt.ylabel('y')
plt.title('plot1')

# plot2
x = np.array([1, 3, 5, 8])
y = np.array([10, 3, 6, 2])
plt.subplot(1, 1, 1)
plt.plot(x, y)
plt.title('plot2', color='m')

# plot3
x = np.array([1, 6, 7, 8])
y = np.array([10, 3, 6, 2])
plt.subplot(1, 1, 1)
plt.plot(x, y)
plt.title('plot3', color='r')
plt.show()

要求索引一致,注意,show在最后,或者不用subplot也行:

from matplotlib import pyplot as plt
import numpy as np

# plot1
xpoints = np.array([0, 2, 4, 6, 8])
ypoints = np.array([0, 3, 6, 9, 12])
plt.plot(xpoints, ypoints)
plt.xlabel('x')
plt.ylabel('y')
plt.title('plot1')

# plot2
x = np.array([1, 3, 5, 8])
y = np.array([10, 3, 6, 2])
plt.plot(x, y)
plt.title('plot2', color='m')

# plot3
x = np.array([1, 6, 7, 8])
y = np.array([10, 3, 6, 2])
plt.plot(x, y)
plt.title('plot3', color='r')
plt.show()

在这里插入图片描述
可以见到它们公用最后一个标题

4. 颜色条
颜色条对应了从0到1000的颜色,每种颜色都有100个值,颜色条等于是一个图中颜色的坐标轴,因为曲线只有一种颜色,所以用于对应散点图的颜色。

plt.colorbar()

使用颜色条需要设置散点图的cmap 参数,默认值为 ‘viridis’,只有散点图能用,但是我觉得没有什么用,就是个颜色参考表:

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(1, 1000, 800)
y = np.linspace(1, 1000, 800)
c = np.linspace(1, 1000, 800) # 搞个颜色
plt.scatter(x, y, c=c, cmap='viridis')
plt.colorbar()  # 就是多一条而已,起到显示一下对应点颜色的作用的作用
plt.show()

在这里插入图片描述
太密集,直接成直线了。

5.其他类型的图:
用法和前面的类似,简单讲一下:
(1)柱状图 plt.bar(),主要参数有:

参数作用
xx轴坐标,你也可以写一个字符串数组[’年份‘,‘月份’。。。]
yy轴坐标用法同上,要和x对应
width柱子的宽度
bottom柱子的高度,你可以设置一个最低高度,一般用不到
align对齐方式,可以设置center和edge,center即居中,edge时靠右,若想靠左,需要同时设置width为负数
hatch可以设置柱状条的花纹,包括/,
color柱子填充颜色,用法和上面一样
lw柱子边框的宽度
edgecolor柱子的边框颜色,可以指定一个颜色,也可以指定一个数组

(2)条形图plt.barh():参数和上面基本一样。

(3)直方图plt.hist():参数如下:

参数作用
x整数值或者数组序列
bins可以输入一个整数或者是一个元组。若为整数,则规定了条的个数,元组则规定每条的范围
range设置直方图x轴的范围,输入一个元组(x,y)
density是否显示概率密度,输入一个布尔值
cumulative是否计算累计频率,也要求布尔值
bottom要求数组或者整数,对应初始位置,和bar和barh一样
histtype直方图类型。bar表示最普通的;barstacked表示堆叠的直方图;step表示未填充的直方图;
stepfilled表示有填充的直方图,和bar差不了太多
align柱子位置。left表示柱子的中心位于bins的左边缘;mid为中间;right为右边缘。
rwidth整数值,柱子宽度占bins宽的比例
logbool类。是否将x轴对数化,降低量纲

(4)饼图pie():

参数用法
thera每个标记所在射线于极径的角度
r标记点到原点的距离
marker标记点样式,有 . , o v ^ > < *
linestyle线的样式,-,–,-.,:
linewidth浮点数,线的宽度
color线的颜色
ms标记点的大小

4.总结:

本章学习了用Matplotlib画图的各种技巧,包括折线图,散点图,动图,多图,以及坐标轴,边框,和标题的设置等。但是图像是多种多样的,本讲没有讲完全部的图像,如果需要或者感兴趣 ,大家可以自行百度,或者参考一下这篇博客。到此,机器学习所需要的全部代码知识就都讲完了,接下来就差实践了,实践才能出真知。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值