2.数据可视化高级
2.1 多图布局
2.1.1 子视图
🚩创建子视图可以一个视图一个视图的创建,也可以多个视图一起创建:
单图创建:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi) # 创建子视图:2行1列第1个视图 ax = plt.subplot(2, 1, 1) ax.plot(x, np.sin(x)) # 创建子视图:2行1列第2个视图 ax = plt.subplot(2, 1, 2) ax.plot(x, np.cos(x))
多图一起创建:
# 一次创造多个视图 fig, axes = plt.subplots(2, 2) # 2行2列:四个图 # 索引从0开始 axes[0, 0].plot(x, np.sin(x), color = 'red') axes[0, 1].plot(x, np.sin(x), color = 'green') axes[1, 0].plot(x, np.cos(x), color = 'purple') axes[1, 1].plot(x, np.cos(x))
下面附上一个完整的代码供读者理解:
遇到无法理解的地方可以看后面的代码解释,还是不理解的地方可以评论区留言(有问必答)
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 50) y = np.sin(x) # 子视图1 plt.figure(figsize = (9, 6)) ax = plt.subplot(221) # 两行两列第一个子视图 ax.plot(x, y, color = 'red') ax.set_facecolor('green') # 调用子视图设置方法,设置子视图整体属性 # 子视图2 ax = plt.subplot(2, 2, 2) # 两行两列第二个子视图 line, = ax.plot(x, -y) # 返回绘制对象 line.set_marker('*') # 调用对象设置方法,设置属性 line.set_markerfacecolor('red') line.set_markeredgecolor('green') line.set_markersize(10) # 子视图3 ax = plt.subplot(2, 1, 2) # 两行一列第二行视图 plt.sca(ax) # 设置当前视图 x = np.linspace(-np.pi, np.pi, 200) plt.plot(x, np.sin(x * x), color = 'red')
对上述代码的部分进行讲解:
# 第15行 # line, = ax.plot(x, -y) # 返回绘制对象 import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 50) y = np.sin(x) # 子视图1 plt.figure(figsize = (9, 6)) ax = plt.subplot(221) # 两行两列第一个子视图 ax.plot(x, y, color = 'red') ax.set_facecolor('green') # 调用子视图设置方法,设置子视图整体属性 # 子视图2 ax = plt.subplot(2, 2, 2) # 两行两列第二个子视图 ax.plot(x, -y) # 返回绘制对象
ax.plot(x, -y)
其实就是返回了一句话:[<matplotlib.lines.Line2D at 0x1914fb1d250>]
我们可以发现这句话使用的是列表,我们取出这句话可以用:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 50) y = np.sin(x) # 子视图1 plt.figure(figsize = (9, 6)) ax = plt.subplot(221) # 两行两列第一个子视图 ax.plot(x, y, color = 'red') ax.set_facecolor('green') # 调用子视图设置方法,设置子视图整体属性 # 子视图2 ax = plt.subplot(2, 2, 2) # 两行两列第二个子视图 line = ax.plot(x, -y) # 返回绘制对象 line[0]
我们也可以使用 ,
去取:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 50) y = np.sin(x) # 子视图1 plt.figure(figsize = (9, 6)) ax = plt.subplot(221) # 两行两列第一个子视图 ax.plot(x, y, color = 'red') ax.set_facecolor('green') # 调用子视图设置方法,设置子视图整体属性 # 子视图2 ax = plt.subplot(2, 2, 2) # 两行两列第二个子视图 line, = ax.plot(x, -y) # 返回绘制对象 line
还有一个很容易晕掉的细节:就是我们在绘图的时候几行几列第几个是什么意识:
我们就拿上述代码去说明:
我们假想有一块空白的板子是供我们绘图的,下面来看上述代码:
ax = plt.subplot(221) # 两行两列第一个子视图
这行代码的意思是把我们假想的这块白板,划分称为两行两列的板子:
然后这个图片占据的是第一个板子的位置,对于板子位置我们有如下规定:
板子的编号从1开始,而非从0开始,从左至右,从上至下依次命名板子
所以对上面这个板子,板子的编号为:
所以我们最后图像所显示的其实就是左上角的位置。
接着来看我们的第二个图:
ax = plt.subplot(2, 2, 2) # 两行两列第二个子视图
这下就好理解啦,还是把之前的空白板子分成两行两列,然后编号为2,即右上角。
接着我们来看第三个图:
ax = plt.subplot(2, 1, 2) # 两行一列第二行视图
把我们的空白板子分成两行一列,那么就是下图的形式:
然后我们把第三个图片放到第二个位置,不难想到,该图的第二个位置其实就是对应的我们分成两行两列的 3,4 位置,所以三个图像最终绘制的结果就是:
2.1.2 嵌套
🚩所谓嵌套,其实就是在图形中继续画图:
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-np.pi, np.pi, 25) y = np.sin(x) fig = plt.figure(figsize = (9, 6)) # 创建视图 plt.plot(x,y) # 嵌套方式一,axes轴域(横纵坐标范围),子视图 # x,y,width,height ax = plt.axes([0.2, 0.55, 0.3, 0.3]) # 参数含义[left, bottom, width, height] ax.plot(x, y, color = 'g') # 嵌套方式二 ax = fig.add_axes([0.55, 0.2, 0.3, 0.3]) # 使用视图对象添加子视图 ax.plot(x, y, color = 'r')