Python:Matplotlib笔记
写在前面
写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。所有的内容来自于B站的爆肝杰哥,可以去看他的视频和课件,做的很好。MatPlotlib只学习了其核心模块pyplot。
一、绘图基础
Matplotlib 库太大,画图通常仅仅使用其中的核心模块 matplotlib.pyplot,并给其一个别名 plt,即 import matplotlib.pyplot as plt。
1、绘制图像
现在看一个简单的绘图示例:
import matplotlib.pyplot as pltfig1 = plt.figure() # 创建新图窗x = [ 1, 2, 3, 4, 5 ] y = [ 1, 8, 27, 64, 125 ]plt.plot(x, y) #先描点,再连线plt.show() #显示图像
其中,plot()用于绘制线图和散点图。plt.figure()用于创建新图窗,plt.show()用于显示图像。上面这段代码就绘制了一个指定图像。
2、保存图像
如果要保存图像,可以用.savefig()方法,其中需要一个r字符串来表示保存路径。保存路径必须使用绝对路径。
例如,如果要保存到桌面,绝对路径即:C:\Users\用户名\Desktop。此外,可保存的图形的格式很多,包括:eps、jpg、pdf、png、ps、svg 等。为了保存清晰的图,推荐保存至 svg 矢量格式,即:
fig1.savefig(r'C:\Users\Shuangjiang\Desktop\我的图.svg')
保存为 svg 格式后,可直接拖至 Word 或 Visio 中,即可显示高清矢量图。
3、两种画图方式
Matplotlib 中有两种画图方式:Matlab 方式和面向对象方式。这里先展示两种方式,由于使用习惯,后续会默认使用Matlab方式。
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ]y = [ 1, 8, 27, 64, 125 ]'''
Matlab方式
'''
fig1 = plt.figure()
plt.plot(x, y)'''
面向对象方式
'''
fig2 = plt.figure()
ax2 = plt.axes() # 这里在创建坐标轴
ax2.plot(x, y)plt.show()
二、多图形绘制
1、绘制多线条
在同一个图窗内绘制多线条,可以像这样:
plt.plot(x, y1)
plt.plot(x, y2)
让y1和y2的数据共享同一个x,自然就在一个图形上展示了多线条。
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y1 = [ 1, 2, 3, 4, 5 ] # 数据的 y1 值
y2 = [ 0, 0, 0, 0, 0 ] # 数据的 y2 值
y3 = [ -1, -2, -3, -4, -5 ] # 数据的 y3 值Fig1 = plt.figure()
plt.plot(x,y1)
plt.plot(x,y2)
plt.plot(x,y3)plt.show()
绘制出的图像如图所示:
2、绘制多子图
绘制多子图时,使用subplot函数。 subplot(row, col, index)的三个参数含义为:
1、row:子图的行数
2、col:子图的列数
3、index:当前子图的索引(从1开始,按行优先排序)
代码里使用了subplot(3, 1, x),表示子图的排布方式是三行一列
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y1 = [ 1, 2, 3, 4, 5 ] # 数据的 y1 值
y2 = [ 0, 0, 0, 0, 0 ] # 数据的 y2 值
y3 = [ -1, -2, -3, -4, -5 ] # 数据的 y3 值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.show()
最终绘制出的图像是:
三、图表类型
plt 提供 5 类基本图表,分别是二维图、网格图、统计图、轮廓图、三维图。
1、二维图
二维图有以下几种:
这里只对常用的二维图进行介绍:
(1)plot
plot的基本用法是plot(x, y),也可以不传入x,那么x就会根据y的值来设置为0, 1, 2,...
plot()函数含 color 参数,可以设置线条的颜色。
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y1 = [ 0, 1, 2, 3, 4 ] # 数据的 y1 值
y2 = [ 1, 2, 3, 4, 5 ] # 数据的 y2 值
y3 = [ 2, 3, 4, 5, 6 ] # 数据的 y3 值
y4 = [ 3, 4, 5, 6, 7 ] # 数据的 y4 值
y5 = [ 4, 5, 6, 7, 8 ] # 数据的 y5 值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')plt.show()
运行后得到图像:
上示例中,颜色以十六进制存储。除了设置颜色外,plot还可以设置线条的风格与粗细,其中,使用linestyle参数可设置风格,linewidth可设置粗细:
plt.plot(x, y1, linestyle='-', linewidth=0.5)
plt.plot(x, y2, linestyle='--', linewidth=1)
plt.plot(x, y3, linestyle='-.', linewidth=1.5)
plt.plot(x, y4, linestyle=':', linewidth=2)
plt.plot(x, y5, linestyle=' ', linewidth=1)
在设置线条风格时,'-'表示实线,'--'表示虚线,'-.'表示点虚线,':'表示点线,' '表示隐藏该线条。所以,当线条风格设置为‘o’时,就可以用plot绘制散点图。
在设置线条粗细时,数字表示磅数,一般以 0.5 至 3 为宜。
此外,plot函数的marker参数还可以设置线条的标记,标记的尺寸可用markersize参数调整:
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)
(2)scatter
scatter()专门用于绘制散点图。基本语法是scatter(x, y)
import matplotlib.pyplot as plt
import numpy as npx = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])plt.scatter(x, y)
plt.show()
同样的,scatter也能传入参数进行相关设置。例如,
参数s可以改变点的大小默认20,
参数c可以改变点的颜色,默认蓝色'b'
参数marker可以改变点的样式,默认'o'
参数alpha可以改变点的透明度,等
2、网格图
网格图有以下几种:
现在来介绍imshow()函数。imshow()是用于显示图像数据的核心函数,它能将二维数组(或三维数组)以图像的形式可视化。它将数值矩阵映射为像素颜色。
plt.imshow(X, cmap=None)
其中,X是图像数据,可以传入二维或三维数组。
1、二维数组(shape=(M, N)
):表示灰度图,每个元素对应一个像素的亮度。数值范围通常为[0, 255](整数)或者[0, 1](浮点数)
2、三维数组(shape=(M, N, 3)
):表示 RGB 彩色图,最后一维为红、绿、蓝三个通道。
3、三维数组(shape=(M, N, 4)
):还包含 alpha 通道(透明度)。
cmap是颜色映射表,用于将数值映射为颜色。默认使用viridis,表示蓝绿黄橙渐变,gray是灰度映射,jet是蓝青绿黄红渐变,hot是黑→红→黄→白,cool是青→紫渐变。
此外,还可以用plt.colorbar()显示颜色条。
下面来看一段代码:
import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0,10,1000)
I = np.sin(x) * np.cos(x).reshape(-1,1)Fig1 = plt.figure()
plt.imshow(I)
plt.show()
其中,np.linspace是Numpy中用于生成等差数列的函数。np.linspace(start, stop, num),其中start是序列的起始值,stop是序列的终止值,num是生成的样本数量(默认50)。
以上代码得到的结果是:
3、统计图
统计图使用的是hist()函数。hist 则是统计学的函数,是为了看清某分布的均值与标准差。使用方式是:plt.hist(data)
import matplotlib.pyplot as plt
import numpy as npdata = np.random.randn( 10000 )Fig1 = plt.figure()
plt.hist( data )
plt.show()
可用bins参数来划分区间的数量,默认值为10:
plt.hist( data, bins = 30 )
可得到下图:
还可使用alpha参数改变透明度,默认为1;参数color改变颜色,edgecolor改变边缘颜色:
plt.hist( data, alpha=0.5 ,color='#A2A2D0',edgecolor='#FFFFFF')
最后,可以用histtype改变类型。默认的类型是bar,这样的直方图放大后看之间有间隙,改为stepfilled后,图形浑然一体:
plt.hist( data, histtype='stepfilled')
四、图窗属性
1、坐标轴上下限
尽管 Matplotlib 会自动调整图窗为最佳的坐标轴上下限,但很多时候仍需手动设置,才能适应当时的情况。设置坐标轴上下限有两种方法:lim 法与 axis 法。
(1)lim法
可使用plt.xlim和plt.ylim分别设置x、y轴的上下限:
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值Fig1 = plt.figure()
plt.plot(x,y)
plt.xlim(1,5)
plt.ylim(1,125)
plt.show()
运行得:
(2)axis法
plt.axis([1, 5, 1, 125])
此外,还可以使用
plt.axis('equal')
使 x 轴与 y 轴的比例达到 1:1,长度等长。
2、标题与轴名称
标题使用plt.title(),轴名称分别使用plt.xlabel()、plt.ylabel()。
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y = [ 1, 8, 27, 64, 125 ] # 数据的 y 值Fig1 = plt.figure()
plt.plot(x,y)
plt.title('This is the title.')
plt.xlabel('This is the xlabel')
plt.ylabel('This is the ylabel')
plt.show()
3、图例
图例可使用plt.legend()添加,除此之外,还需要使用plot的label参数。如果不想展示某些线条的图例,只需要去除该函数中的label关键字。
legend 有三个常用的关键字参数:loc、frameon 和 ncol。
1、loc:用于表示图例位置,该关键字在 upper、center、lower 中选一个,在left、center、right 中选一个,用法如 loc='upper right',表示图例放在右上方,也可以 loc='best',编译器挑选最好的位置。
2、frameon:用于表示图例边框,去边框是 frameon=False
3、ncol:用于表示图例的列数,默认是 1 列,也可以通过 ncol=2 调为 2 列。
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y1 = [ 1, 2, 3, 4, 5 ] # 数据的 y1 值
y2 = [ 0, 0, 0, 0, 0 ] # 数据的 y2 值
y3 = [ -1, -2, -3, -4, -5 ]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()
plt.show()
运用legend参数,如loc:
plt.legend(loc = 'lower center')
图例的位置就发生了改变:
4、网格
可以使用plt.grid()函数给图像加上网格。同样的,grid()函数也有color和linestyle两个参数来更改颜色和样式,与plot一致。
import matplotlib.pyplot as pltx = [ 1, 2, 3, 4, 5 ] # 数据的 x 值
y1 = [ 1, 2, 3, 4, 5 ] # 数据的 y1 值
y2 = [ 0, 0, 0, 0, 0 ] # 数据的 y2 值
y3 = [ -1, -2, -3, -4, -5 ]Fig1 = plt.figure()
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.grid(color='#000000',linestyle='--')
plt.show()
得到图像: