matplotlib绘图与子图
matplotlib绘图与子图
绘图基础
-
画布figure, 代表了整幅图,通过包括底图、axes对象以及其它图元素的方式,囊括了全部图元素。
-
axes对象(图形区)总是从属于.figure类对象,须创建在figure类对象中。
-
axes对象(图形区),实现了这张图的数据区内容,是制图表达的核心内容。
-
一个figure对象,可以包含多个axes对象
-
figure 可以添加很多axes对象 add_axes添加一个axes对象,add_subfigure添加子图,add_subplots添加一个或一组axes对象
-
画纸上最上方是标题title,用来给图形起名字
-
坐标轴Axis,横轴叫x坐标轴xlabel,纵轴叫y坐标轴ylabel
-
图例Legend, 代表图形里的内容
-
网格Grid, 图形中的虚线,True显示网格
-
点 Markers:表示点的形状。
plt.figure
plt.figure 初始化画板,设置窗口尺寸大小,分辨率
fig = plt.figure(figsize=(a, b),dpi=100)
输入 a为图形的宽, b为图形的高,单位为英寸。 dpi 分辨率
返回 figure 对象
fig.subplots
fig.subplots 添加一组子图
axs = fig.subplots(nrows=1, ncols=1,*arg,**kwargs)
输入 nrows=1, ncols=1 分别是行和列
返回 axes的对象列表 [axes]
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=[9,6],dpi=100) # 创建画布,figure
axs = fig.subplots(1,2) # 设置axs分布
x=np.arange(0,5,0.2)
y1=np.sin(x)
y2=np.e**(0.4*x)-2
y3=np.cos(x)
y4=0.5*x
print(x)
axs[0].plot(x,y1,label="sin")
axs[0].plot(x,y2,label='exp')
axs[1].plot(x,y3,'--',label='cos')
axs[1].plot(x,y4,'-.',label="linear")
axs[0].legend()
axs[1].legend()
axs[0].grid()
plt.show()
![img](https://img2023.cnblogs.com/blog/2009774/202307/2009774-20230725210221874-1063726595.png)
fig.add_subplot
fig.add_subplot 添加一个子图
ax = fig.add_subplot(nrows, ncols, index)
输入 nrows, ncols, index 行、列、索引
返回 axes的对象
axs = fig.subplots(1,2) # 设置axs分布
等价于
axs1 = fig.add_subplot(1, 2, 1)
axs2 = fig.add_subplot(1, 2, 2)
import numpy as np
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(8,8),dpi=80)
# 可从图中看到,我们的画布是分为2x2的区域
ax1=fig.add_subplot(2,2,1)
ax1.plot([1,2,3,4],[1,2,3,4])
ax2=fig.add_subplot(2,2,2)
ax2.plot([1,2,3,4],[2,2,3,4])
ax3=fig.add_subplot(2,2,3)
ax3.plot([1,2,3,4],[1,2,2,4])
ax4=fig.add_subplot(2,2,4)
ax4.plot([1,2,3,4],[1,2,3,3])
plt.show()
![img](https://img2023.cnblogs.com/blog/2009774/202307/2009774-20230725211732929-1173073258.png)
fig.add_axes
fig.add_axes自由绘制子图
ax = fig.add_axes(left, bottom, width, height)
输入 rect=((left, bottom, width, height)) 画图上的坐标
返回 axes的对象
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure(figsize=[9,6],dpi=90) # 获得figure对象
ax1 = fig.add_axes([0.2, 0.5, 0.2, 0.3],
ylim=(-1.2, 1.2)) # 左边20% 底部50% 宽20% 高30%
ax2 = fig.add_axes([0.1, 0.05, 0.8, 0.4],
ylim=(-1.2, 1.2)) # 左边10% 底部5% 宽80% 高40%
x = np.linspace(0, 10)
ax1.plot(np.sin(x),'r')
ax2.plot(np.cos(x),'--')
ax1.grid() # ax1 添加网格
plt.show()
![img](https://img2023.cnblogs.com/blog/2009774/202307/2009774-20230725213032526-1719486022.png)
缺省和就近原则
缺省是指无主动指明的情况下,系统自动提供的资源。
- 画图板的缺省是:figure(1)
- 图形区的缺省是:subplot(111)
就近原则:在每个函数操作时对上一层资源的依赖遵守最近原则,举例如下:
- subplot()作用在最近使用的画图板上,有可能是缺省的画图板figure(1)。
- axes()作用在最近使用的画图板上,有可能是缺省的画图板figure(1)。
- axis()作用在最近使用的图形区上,可能来自subplot、axes等
- plot()作用在最近使用的图形区上,可能来自subplot、axes等
总结
1、首先创建一个合适大小的画布 figure
2、然后再在画布上设置图形区区对象 **axes ** (只需要一个图像区,可以省略)
3、紧接着分别 在图形区对象 axes 绘制图像和图形,进行独立设置 (只需要一个图像区, 可以直接plot 代替)
4、最后再将 画布 figure 进行展示或者保存
参考资料