2.1.3 多图布局分格显示
2.1.3.1 均匀布局
🚩每张图片都是均匀展示的
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,2*np.pi) # sharex:所有小图共享x轴 sharey:表示所有小图共享y轴 坐标轴以所有小图中范围最大的进行显示 fig, ((ax11,ax12,ax13), (ax21,ax22,ax23),(ax31,ax32,ax33)) = plt.subplots(3, 3) # 也可通过plt.subplot() 一个个添加子视图 fig.set_figwidth(9) fig.set_figheight(6) ax11.plot(x,np.sin(x)) ax12.plot(x,np.cos(x)) ax13.plot(x,np.tanh(x)) ax21.plot(x,np.tan(x)) ax22.plot(x,np.cosh(x)) ax23.plot(x,np.sinh(x)) ax31.plot(x,np.sin(x) + np.cos(x)) ax32.plot(x,np.sin(x * x) + np.cos(x * x)) ax33.plot(x,np.sin(x) * np.cos(x)) # 紧凑显示,边框会比较小,可以注释掉该行查看效果 plt.tight_layout() plt.show()
2.1.3.2 不均匀分布
🚩上图中代码运行所展示的就是均匀分布的结果,可以看出每张图片所占的空间大小都是均等的,如下面图片的展示结果,就是不均匀分布:
为显示如上图的不均匀分布,我们有三种方法
方法一:
import numpy as np import matplotlib.pyplot as plt # 需要导入gridspec模块 x = np.linspace(0, 2 * np.pi, 200) fig = plt.figure(figsize = (12, 9)) # 使用切片方式设置子视图 ax1 = plt.subplot(3, 1, 1) # 视图对象添加子视图 ax1.plot(x, np.sin(10 * x)) # 设置ax1的标题,xlim、ylim、xlabel、ylabel等所有属性现在只能通过set_属性名的方法设置 ax1.set_title('ax1_title') # 设置小图的标题 ax2 = plt.subplot(3, 3, (4, 5)) ax2.set_facecolor('green') ax2.plot(x, np.cos(x),color = 'red') ax3 = plt.subplot(3, 3, (6, 9)) ax3.plot(x,np.sin(x) + np.cos(x)) ax4 = plt.subplot(3, 3, 7) ax4.plot([1, 3], [2, 4]) ax5 = plt.subplot(3, 3, 8) ax5.scatter([1, 2, 3], [0, 2, 4]) ax5.set_xlabel('ax5_x',fontsize = 12) ax5.set_ylabel('ax5_y',fontsize = 12) plt.show()
方法二:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi, 100) plt.figure(figsize = (12, 9)) # 子视图1 ax1 = plt.subplot2grid(shape = (3, 3),# 布局形状 loc = (0, 0), # 布局绘制位置 colspan = 3) # 跨几列 ax1.plot(x, np.sin(10 * x)) # 设置ax1的标题,xlim、ylim、xlabel、ylabel等所有属性现在只能通过set_属性名的方法设置 ax1.set_title('ax1_title') # 设置小图的标题 # 子视图2 ax2 = plt.subplot2grid((3, 3), (1, 0), colspan = 2) # 跨两列 ax2.set_facecolor('green') ax2.plot(x,np.cos(x),color = 'red') # 子视图3 ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan = 2) # 跨两行 ax3.plot(x,np.sin(x) + np.cos(x)) # 子视图4 ax4 = plt.subplot2grid((3, 3), (2, 0)) ax4.plot([1, 3], [2, 4]) # 子视图5 ax5 = plt.subplot2grid((3, 3), (2, 1)) ax5.scatter([1, 2, 3], [0, 2, 4]) ax5.set_xlabel('ax5_x',fontsize = 12) ax5.set_ylabel('ax5_y',fontsize = 12)
方法三:
import numpy as np import matplotlib.pyplot as plt # 需要导入gridspec模块 import matplotlib.gridspec as gridspec x = np.linspace(0, 2 * np.pi, 200) fig = plt.figure(figsize = (12, 9)) # 将整个视图分成3x3布局 gs = gridspec.GridSpec(3, 3) # 使用切片方式设置子视图 ax1 = fig.add_subplot(gs[0, :]) # 视图对象添加子视图 ax1.plot(x,np.sin(10 * x)) # 设置ax1的标题,xlim、ylim、xlabel、ylabel等所有属性现在只能通过set_属性名的方法设置 ax1.set_title('ax1_title') # 设置小图的标题 ax2 = plt.subplot(gs[1, :2]) # 模块调用 ax2.set_facecolor('green') ax2.plot(x,np.cos(x), color = 'red') # 从第一行到最后,占1、2两行,后面的2表示只占用第二列,也就是最后的一列 ax3 = plt.subplot(gs[1:, 2]) ax3.plot(x,np.sin(x) + np.cos(x)) # 倒数第一行,只占第0列这一列 ax4 = plt.subplot(gs[-1, 0]) ax4.plot([1, 3], [2, 4]) # 倒数第一行,只占倒数第二列,由于总共三列,所以倒数第二列就是序号1的列 ax5 = plt.subplot(gs[-1, -2]) ax5.scatter([1, 2, 3], [0, 2, 4]) ax5.set_xlabel('ax5_x',fontsize = 12) ax5.set_ylabel('ax5_y',fontsize = 12) plt.show()
2.1.4 双轴显示
🚩有时候,有两个轴是不够用的,我们经常会见到如下的图形,下述图形的样式就是双轴显示:
就比如我们在绘制正弦波和指数函数的时候,让他们在一个 y yy轴上显示是不合理的:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 50) y = np.sin(x) plt.plot(x, y, color = 'blue') _ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue') y2 = np.exp(x) plt.plot(x, y2, color = 'red')
所以,这个时候就需要我们的双轴显示:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 50) y = np.sin(x) plt.plot(x, y, color = 'blue') _ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue') # 获取当前视图 ax = plt.gca() # 双胞胎,相当于两个x轴,并且是合到一起的 # 这两个x轴对应的是两个y轴 ax2 = ax.twinx() # 其中一个视图纵坐标范围是 -1~1.0,另一个视图范围是0~25 # 刻度是自适应的,当然也可以进行调整 # 默认向 ax2这个子视图中绘制 y2 = np.exp(x) plt.plot(x, y2, color = 'red')
坐标是虽然是自适应的,但是我们也可以对其进行调整:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 50) y = np.sin(x) plt.plot(x, y, color = 'blue') _ = plt.yticks(np.linspace(-1, 1, 11), color = 'blue') # 获取当前视图 ax = plt.gca() # 双胞胎,相当于两个x轴,并且是合到一起的 # 这两个x轴对应的是两个y轴 ax2 = ax.twinx() # 其中一个视图纵坐标范围是 -1~1.0,另一个视图范围是0~25 # 刻度是自适应的,当然也可以进行调整 # 默认向 ax2这个子视图中绘制 y2 = np.exp(x) plt.plot(x, y2, color = 'red') # 规定刻度 _ = plt.yticks(np.arange(0, 26, 5), color = 'red')