绘制图的基本内容
是不是感觉一幅图形要注意的地方很多很复杂~
但是,总体来说,在利用 Matplotlib 绘制图形时,主要图形元素包括画布(figure)、坐标图形(axes)、轴(axis)和艺术对象(aritist)
这些是一幅图形不可或缺的元素。
在这里将简要用书面的语言介绍以上几个元素。
画布 (figure)
包含其他多个图形元素。它既可以代表图形本身进行图的绘制,又可以被划分为多个子区域,用于单独图形类型的 (子图)绘制。用户可以在画布(figure)中设置画布大小(figsize)、分辨率(dpi)和背景颜色等其他参数。
坐标图形 (axes)
也称为子图。作为 Matplotlib 的绘图核心,它主要为绘图数据提供展示区域,同时包括组成图的众多艺术对象 (artist)。在大多数情况下,一个画布 (figure) 对象中包含一个子图区域,子图区域由上、下、左、右 4 个轴脊以及其他构成子图的组成元素组成。
轴 (axis)
数据轴对象,即坐标轴线。每个轴对象都含有位置(locator)对象和格式(formatter)对象,它们分别用于控制坐标轴刻度的位置和格式。
刻度 (tick)
即刻度对象。每个坐标图形都有水平方向的横轴(X axis)对象和垂直方向的纵轴(Y axis)对象。每个坐标轴上含有刻度对象。刻度对象包括主刻度(Major tick)、次刻度(Minor tick)、主刻度标签(Major tick label)和次刻度标签(Minor tick label)。
那么怎么用通常的话语来理解python中利用Matplotlib来做图的过程呢?
在下面这篇知乎专栏中,我的同学(大佬)做出了如下的解释,我认为写的很通俗易懂,故这里引用以下:
以生活中的情况作为例子,假设你现在突然灵感乍现,想要画个对比图(也就是要在图上画两张图),最后把画出来的图片给朋友分享,你会怎么弄呢?
- 拿出一张白纸(画图)和笔
- 将白纸对折(或者拿铅笔简单的画个线),形成两个区域(子图)
- 在其中的一张子图上,你进行创作,比如画上横纵坐标,写上刻度,画出一条折线,在另一张子图上,也进行类似的创作
- 最后,将图片给朋友分享
那么类似的,在matplotlib我们怎样进行操作呢
- 创建一个fig(画布),相当于拿到了一张白纸,以后的创作将在这张白纸上进行
- 将这个图纸进行划分,形成多个子图(axes)。注:axes是axis的复数,但在matplotlib里面却有着截然不同的用法,axis是轴(属于内容部分),而axes作为子图进行使用
- 在每个子图上进行内容的继续创作
- 最后,将这个内容展示出来
2.Matplotlib入门 - 知乎 (zhihu.com)
以下就是利用Matplotlib绘制正弦曲线的例子:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建图像和子图
plt.figure(figsize=(8, 6)) # 创建一个图像,设置图像大小
plt.plot(x, y, label='正弦曲线', color='blue', linestyle='-', linewidth=2) # 绘制曲线
plt.scatter(x[::10], y[::10], marker='o', color='red', label='样本点') # 绘制散点
# 添加标题和标签
plt.title('正弦曲线示例', fontsize=16) # 添加图像标题
plt.xlabel('X轴', fontsize=14) # 添加X轴标签
plt.ylabel('Y轴', fontsize=14) # 添加Y轴标签
# 添加图例
plt.legend(loc='upper right') # 添加图例,指定位置
# 调整坐标轴范围
plt.xlim(0, 10) # 设置X轴范围
plt.ylim(-1.5, 1.5) # 设置Y轴范围
# 显示网格
plt.grid(True, linestyle='--', alpha=0.7) # 显示网格线,设置线型和透明度
# 显示图像
plt.show() # 在屏幕上显示图像
其中
import matplotlib.pyplot as plt: 导入matplotlib库中的绘图函数,并将其命名为plt,以方便调用。
import numpy as np: 导入numpy库并将其命名为np,以便生成示例数据。
x = np.linspace(0, 10, 100): 使用np.linspace生成一个包含100个数据点的等间隔数组。
y = np.sin(x): 使用numpy的sin函数计算x的正弦值,生成y的数据。
plt.figure(figsize=(8, 6)): 创建一个图像,设置图像的大小为8x6英寸。
plt.plot(x, y, label='正弦曲线', color='blue', linestyle='-', linewidth=2): 绘制正弦曲线,设置标签、颜色、线型和线宽。
plt.scatter(x[::10], y[::10], marker='o', color='red', label='样本点'): 绘制散点图,每隔10个点绘制一个散点,设置标记样式和颜色。
plt.title('正弦曲线示例', fontsize=16): 添加图像标题,设置标题内容和字体大小。
plt.xlabel('X轴', fontsize=14): 添加X轴标签,设置标签内容和字体大小。
plt.ylabel('Y轴', fontsize=14): 添加Y轴标签,设置标签内容和字体大小。
plt.legend(loc='upper right'): 添加图例,位置位于右上角。
plt.xlim(0, 10): 设置X轴范围为0到10。
plt.ylim(-1.5, 1.5): 设置Y轴范围为-1.5到1.5。
plt.grid(True, linestyle='--', alpha=0.7): 显示网格线,设置线型为虚线,透明度为0.7。
plt.show(): 显示绘制的图像。
这里没有用到子图绘制,但是比较重要的部分就在于多子图的绘制
多子图的绘制
创建子图的方式有特别多种
注:在子图中,每个子图对应的数字,是从上到下,从左到右计数的
接下来我们介绍创建子图的几种方法(因为是阅读图书,代码部分为了方便就直接截图显示):
如果你需要创建子图,要利用以下代码:
axes=plt.subplot(a,b,c)
其中,a、b代表你会把这张画布分成a行b列,而c代表你把这个图放的位置对应的数字
比如subplot(222),意味着把图分成四行四列,然后放在从上到下,从左到右第二个的位子
subplot()函数
Matplotlib 提供的 subplot() 函数可以对当前画布对象添加单个子图,且每次添加子图都会规定其位置顺序。
书上示例代码:
示例结果如图:
add_subplot()函数
Matplotlib 中的 add_subplot() 函数的使用方法和 subplot() 函数类似,不同之处是,add_subplot() 函数先产生 figure 对象,然后在该对象的基础上依次添加子图
subplots()函数
该函数的第 1 个参数 nrows 表示绘制子图的行数,第 2 个参数 ncols 表示绘制子图的列数,行数与列数的乘积即绘制的总子图数,第 3 个参数 sharex 可以用来设定是否共享 X 轴,第 4个参数 sharey 可以用来设定是否共享 Y 轴。该函数会返回一个坐标数组对象,该对象用于每个子图的单独绘制。
示例代码:
绘制结果:
axex()函数
Matplotlib 中的 axes() 函数的主要功能是为当前画布 (figure) 对象添加坐标图形 (axes) 对象,使其成为当前的坐标图形(axes)对象。此外,还需要提供 rect 参数(一个四元组:left、 bottom、width、height)。axes() 函数常见用法包括对当前画布 (figure) 对象中的坐标图形 (axes) 对象添加颜色和大小映射等,或者在已有的坐标图形 (axes) 对象上添加另一个坐标图形 (axes) 对象。
绘制结果如下:
subplot2grid()函数
该函数的第 1 个参数 shape 规定了的网格的行数和列数,第 2 个参数 location 决定了子图在网格内的行号和列号,第 3 个参数为 rowspan 或 colspan,它们分别规定了每个子图向下跨27越的行数和向右跨越的列数,也就实现了大小不一的子图的绘制。
绘制结果:
gridspec.GridSpec()函数
其中,参数 nrows 表示网格中的行数;参数 ncols 表示网格中的列数;left、bottom、right和 top 是可选参数,用于将子图的范围定义为图形宽度或高度的一部分。
绘制结果:
subplot_mosaic()函数
subplot_mosaic() 函数绘制子图的最大特点是它可利用 mosaic 参数设置特定字符串符号(重复次数、顺序等)来进行子图的视觉布局。
绘制结果:
Tips:子图的数量尽量控制在四个以内,否则即增加了代码量,又会出现一些标题字体的显示错误。