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:段鹏浩
@Time:2023/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 |
仿宋_GB2312 | FangSong_GB2312 |
楷体_GB2312 | KaiTi_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(),主要参数有:
参数 | 作用 |
---|---|
x | x轴坐标,你也可以写一个字符串数组[’年份‘,‘月份’。。。] |
y | y轴坐标用法同上,要和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宽的比例 |
log | bool类。是否将x轴对数化,降低量纲 |
(4)饼图pie():文章来源:https://www.toymoban.com/news/detail-755292.html
参数 | 用法 |
---|---|
thera | 每个标记所在射线于极径的角度 |
r | 标记点到原点的距离 |
marker | 标记点样式,有 . , o v ^ > < * |
linestyle | 线的样式,-,–,-.,: |
linewidth | 浮点数,线的宽度 |
color | 线的颜色 |
ms | 标记点的大小 |
4.总结:
本章学习了用Matplotlib画图的各种技巧,包括折线图,散点图,动图,多图,以及坐标轴,边框,和标题的设置等。但是图像是多种多样的,本讲没有讲完全部的图像,如果需要或者感兴趣 ,大家可以自行百度,或者参考一下这篇博客。到此,机器学习所需要的全部代码知识就都讲完了,接下来就差实践了,实践才能出真知。文章来源地址https://www.toymoban.com/news/detail-755292.html
到了这里,关于第十章 Matplotlib绘图方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!