前言
Hello 大家好!我是甜美的江。
今天我们将 深入了解Matplotlib中的子图的创建方法
而子图是Matplotlib中的一个重要概念,它们为我们提供了在同一图形中容纳多个独立图表的便捷方式。通过灵活运用子图,我们能够呈现更为丰富和详尽的信息,让数据背后的故事更为生动。
本篇博客将深入探讨Matplotlib中有关在Figure中创建子图的方法。我们将了解如何基于行、列和索引来布局子图。
无论你是数据科学家、工程师还是对数据可视化感兴趣的初学者,这篇博客都将为你提供全面的指导,助你在Matplotlib的世界中游刃有余。让我们开始这段关于子图创作的探险吧!
至于配置子图的各种属性,以及通过不同的绘图方法在子图中展示数据,由于篇幅问题,我将会通过后面的文章展示,也请大家点点关注,不要迷路哦。
接下来就让我们进入正文吧!
在Matplotlib提供了两种主要的子图创建方法:add_subplot()和add_axes()。
add_subplot()方法通过指定网格的行、列和子图的位置索引来创建子图,
而add_axes()方法则通过指定子图在整个图形区域中的相对位置和大小的方式创建子图。
add_subplot()更适合简单的子图布局,适用于均匀划分的网格结构,而add_axes()则更加灵活,允许直接指定子图的精确位置和大小,适用于复杂和自定义的布局需求。
选择合适的方法取决于具体的绘图目标和布局要求,这两种方法共同为用户提供了在Matplotlib中灵活创建和配置子图的手段。
接下来我们将具体介绍这两种方法。
一 add_axes( **kwargs):
add_axes()方法是Matplotlib中用于在Figure对象中创建子图(Axes对象)的函数。它允许用户以更为灵活的方式指定子图在整个图形区域中的位置和大小。
1.1 函数介绍
语法:
add_axes(rect, projection=None, polar=False, **kwargs)
参数:
- rect: 用于指定新添加的 Axes 对象的位置和大小,是一个包含四个值的列表或元组,分别表示左、底、宽度和高度。这些值的范围都应该在
[0, 1] 之间,表示相对于 Figure 的比例。- projection: 指定 Axes 对象的投影类型,通常用于创建特定类型的图,例如 3D 图等。默认为 None。
- polar: 一个布尔值,指定是否使用极坐标系。默认为 False。
- **kwargs: 其他关键字参数,用于设置 Axes 对象的属性。
返回值:
返回一个Axes对象,可以通过该对象进行进一步的配置和绘制。
类比:
假设我们有一个大的画廊(Figure)代表整个可用的绘图空间。我们想在这个画廊上挂上一些画(Axes对象)。add_axes
方法就像在画廊的特定位置挂上一幅完全自定义大小和位置的画。
1.2 示例一 创建第一张子图
代码:
import matplotlib.pyplot as plt # 创建一个画廊(Figure),就像是一面大墙 fig = plt.figure() # 在画廊上选择一个完全自定义的位置和大小,添加一个新的子图 ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) ax.plot([0, 1], [0, 1]) ax.set_title('Custom Painting') # 展示画廊 plt.show()
代码分析:
在这段代码中,我们使用 Matplotlib 创建一个画廊(Figure),类比为一面大墙,然后在画廊上选择一个完全自定义的位置和大小,添加了一个新的子图(Axes 对象)。
通过 fig.add_axes([0.1, 0.1, 0.8, 0.8]),在画廊的位置(左下角起始点为 (0, 0),右上角为 (1, 1))指定了一个相对位置和大小,创建了一个具有自定义尺寸和位置的子图 ax。
在该子图上,通过 ax.plot([0, 1], [0, 1]) 绘制了一条线,表示画的内容,然后使用 ax.set_title(‘Custom Painting’) 设置了子图的标题为 ‘Custom Painting’。
最后,通过 plt.show() 展示整个画廊,将这个自定义位置和大小的子图呈现在一个窗口中。这种方式使得可以更灵活地控制图形的布局,适用于需要特定尺寸和位置的图形显示场景。
运行结果:
1.3 示例二 polar参数的运用
代码:
import matplotlib.pyplot as plt import numpy as np # 生成一些示例数据 theta = np.linspace(0, 2*np.pi, 100) r = theta # 极坐标下的半径 # 创建极坐标图 plt.polar(theta, r, label='Example Polar Plot') # 添加标题和图例 plt.title('Polar Plot Example') plt.legend() # 显示图形 plt.show()
代码分析:
这个例子中,theta 是角度的数组,r 是极坐标下的半径。通过使用 plt.polar() 函数,我们可以创建一个极坐标图。polar=True 参数告诉 Matplotlib 使用极坐标系。
这个简单的例子绘制了一个以角度为横坐标、半径为纵坐标的极坐标图。在这个图中,半径随着角度的增加而增加,因此图形呈螺旋状。
运行结果:
1.4 示例三 创建多张子图
使用add_axes()方法创建不同位置和大小的多个子图涉及指定每个子图在整个Figure中的位置和大小。
代码:
import matplotlib.pyplot as plt # 创建Figure对象 fig = plt.figure() # 使用add_axes()方法创建第一个子图 ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # 左、底、宽、高的比例 # 使用add_axes()方法创建第二个子图 ax2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # 左、底、宽、高的比例 # 对子图进行配置和绘制操作 ax1.plot([1, 2, 3, 4], [10, 20, 25, 30], label='Subplot 1') ax2.plot([1, 2, 3, 4], [30, 25, 20, 10], label='Subplot 2') # 显示图例 ax1.legend() ax2.legend() # 显示图形 plt.show()
代码分析:
这段代码使用Matplotlib创建了一个包含两个子图的图形。首先,通过plt.figure()创建了一个Figure对象。
然后,使用add_axes()方法分别创建了两个子图ax1和ax2,并通过指定左、底、宽、高的比例来定义它们的位置和大小。
在配置和绘制子图方面,ax1和ax2分别使用plot()方法绘制了不同的曲线,并通过label参数为每个曲线指定标签。
随后,通过ax1.legend()和ax2.legend()分别在两个子图上显示图例。
最后,通过plt.show()显示整个图形。这段代码展示了如何在一个图形中创建多个自定义位置和大小的子图,并在子图上绘制不同的数据,同时添加图例以提供数据标识。
运行结果
从结果中,我们可以看到,虽然我们成功创建了两张子图,但是很明显,两张子图有着重叠,这也是add_axes()的一个缺点,add_axes()提供了相对底层的接口,需要手动指定每个子图的位置和大小。
对于初学者而言,可能需要花更多的时间理解和调整参数,所以在创建多个子图的时候,建议使用add_subplot()方法,接下来就让我们进入对它的学习吧。
二 add_subplot(*args, **kwargs):
add_subplot(*args, **kwargs)是Matplotlib中用于在Figure对象中创建子图(AxesSubplot对象)的方法。它允许用户通过指定行数、列数和子图位置索引等参数,在整个图形区域中创建均匀划分的子图网格。
2.1 函数介绍
语法
add_subplot(nrows, ncols, index, **kwargs)
参数
- nrows: 子图网格的行数。
- ncols: 子图网格的列数。
- index: 要添加的子图的位置,从左上角开始逐行逐列计数,例如,3 表示第三个位置。
- **kwargs: 其他关键字参数,用于设置 Axes 对象的属性。
返回值
返回值是一个AxesSubplot对象。
AxesSubplot是SubplotBase的子类,它表示在Figure中创建的子图。通过返回的AxesSubplot对象,可以对子图进行各种配置和绘制操作,例如添加数据、设置坐标轴标签、调整子图布局等。
这样的对象可以用于在创建的子图上执行各种定制化的任务,使用户能够灵活控制图形的外观和内容。
可以将 add_subplot 方法类比为将一张画布(Figure)分成若干小块,每个小块就是一个子图(Axes)。这个方法是在画布上规划子图的位置和布局,然后返回一个代表特定子图的 Axes 对象,以便在该子图上进行绘图。
类比:画廊的墙上挂画
想象你有一面大墙(Figure),你想在这面墙上挂上几幅画。你可以将这面墙分成若干小块,每个小块就是一个子图(Axes)。
add_subplot 就像是在这面墙上选择一个小块的位置,然后返回一个代表这个小块的画布。
2.2 示例一
import matplotlib.pyplot as plt # 创建一个画布(Figure),就像是一面大墙 fig = plt.figure() # 在这面墙上选择一个位置,添加一个子图 ax1 = fig.add_subplot(2, 2, 1) ax1.plot([0, 1], [0, 1]) ax1.set_title('Painting 1') # 在另一个位置添加另一个子图 ax4 = fig.add_subplot(2, 2, 4) ax4.plot([0, 1], [0, -1]) ax4.set_title('Painting 4') # 继续添加更多子图... # 调整整个墙上挂画的布局 plt.tight_layout() # 展示画廊 plt.show()
代码分析:
这段代码使用 Matplotlib 创建一个画布(Figure),类比为一面大墙,然后在墙上选择两个位置并分别添加两个子图。
首先,通过 plt.figure() 创建一个画布 fig,这是整个图形的容器。接着,使用 fig.add_subplot(2, 2, 1) 在画布上选择第一个位置,创建一个子图 ax1,并使用 ax1.plot([0, 1], [0, 1]) 在该子图上绘制一条线。设置子图标题为 ‘Painting 1’。
接着,使用 fig.add_subplot(2, 2, 4) 在画布上选择第四个位置,创建另一个子图 ax4,并使用 ax4.plot([0, 1], [0, -1]) 在该子图上绘制另一条线。设置子图标题为 ‘Painting 4’。
代码中有注释提示可以继续添加更多子图,然后通过 plt.tight_layout() 调整整个画布上挂画的布局,确保子图之间的间距适当。
最后,使用 plt.show() 展示整个画廊,将所有的子图呈现在一个窗口中。这种方式使得可以在同一个画布上创建一个复杂的图形布局,类似于在一面墙上挂多幅画。
运行结果:
在这个类比中,add_subplot 就是在画廊的墙上选择一个位置,并返回一个代表这个位置的画布。然后,你可以在这个画布上绘制你想要的图像(挂上你想要的画)。通过在不同的位置添加子图,你就可以在一张大墙上创建一个复杂的画廊。
三 两种方法的区别
add_subplot()和add_axes()是Matplotlib中用于创建子图的两种主要方法,它们之间有以下区别:
3.1 参数形式
add_subplot()方法接受行数、列数和子图位置索引等参数,用于在整个图形区域中创建均匀划分的子图网格。
add_axes()方法接受一个包含四个浮点数的列表作为参数,用于指定子图在整个图形区域中的位置和大小。
3.2 布局灵活性
add_subplot()方法适用于创建简单的网格布局子图,它会将图形区域均匀划分为行数乘以列数的网格,并根据指定的索引位置创建子图。
add_axes()方法更加灵活,允许用户直接指定子图的位置和大小,可以实现各种复杂和自定义的布局。
3.3 适用场景
add_subplot()适用于一般的绘图需求,特别是当子图需要按照规则的网格布局时,比较方便和简洁。
add_axes()适用于需要更精确控制子图位置和大小的情况,特别是对于非均匀划分或自定义布局的需求,具有更大的灵活性和定制性。
3.4 返回对象类型
add_subplot()方法返回的是AxesSubplot对象,是SubplotBase的子类,用于操作子图。
add_axes()方法返回的是Axes对象,用于对子图进行各种配置和绘制操作。
总的来说,add_subplot()适用于简单的网格布局,而add_axes()则适用于需要更灵活和精确控制子图位置和大小的情况。选择合适的方法取决于具体的绘图需求和布局要求。
3.5 类比
想象你正在设计一个相册布局,其中包含多张照片。
这个相册是一个整体的画布,而每张照片则是画布上的子图。
在这个情境下,add_subplot()就好比是将相册的画布均匀地分成行数和列数,然后在每个子区域中放置一张照片,形成一个规整的网格。这种方式适用于希望照片按照规则排列的情况,比如按行或按列排列。
而相对应地,add_axes()则像是你手动地选择并指定每张照片在相册上的位置和大小。
这使得你能够更加灵活地设计相册,可以实现非均匀划分的布局,也能够自定义每张照片的具体位置和大小,创造出更为个性化和复杂的相册布局。
这种方式适用于希望有更多设计自由度、精确控制布局的需求,比如要在相册中添加一张大幅照片或者自由排列的小照片。
因此,在这个相册设计的例子中,add_subplot()类似于规则的照片网格布局,而add_axes()提供了更灵活、更自定义的照片摆放方式,适应了不同的设计需求。
四 两种方法的优缺点
4.1 add_axes()
优点:
灵活性:
add_axes()方法提供了很高的灵活性,允许用户直接指定子图的位置和大小。这意味着你可以实现各种复杂和自定义的布局,包括非均匀划分和自由排列的子图。
定制性:
由于你可以精确控制每个子图的位置和大小,因此可以实现非常定制化的布局,适应各种特殊需求和设计。
多子图场景:
适用于需要在同一Figure中创建多个不同位置和大小的子图的场景,每个子图可以独立地进行配置和绘制。
缺点:
相对复杂:
相对于add_subplot()等简单规则布局的方法,add_axes()可能需要更多的手动调整和计算,特别是在创建多个子图时。这可能使代码相对复杂,并增加错误的可能性。
不适用于简单规律布局:
如果你的需求是在整个画布上创建简单的规律布局,像是网格形式的子图,那么add_axes()可能会显得过于繁琐,此时使用add_subplot()可能更为方便。
相对底层:
add_axes()提供了相对底层的接口,需要手动指定每个子图的位置和大小。对于初学者而言,可能需要花更多的时间理解和调整参数。
总体来说,选择使用add_axes()方法还是其他方法取决于你的具体需求。如果你需要更大的灵活性和定制性,并且能够处理较为复杂的布局,那么add_axes()可能是一个不错的选择。如果你的需求是相对简单的规律布局,那么其他方法可能更为便捷。
4.2 add_subplot()
优点:
简单易用:
add_subplot()方法是一种简单而直观的方式创建子图。你只需要指定子图的行数、列数以及子图的索引位置即可,而无需手动指定位置和大小。
规律布局:
适用于需要在整个Figure上创建规律布局的场景,例如网格形式的子图。通过指定行数和列数,Matplotlib会自动计算每个子图的位置,无需手动计算。
易于理解:
对于初学者而言,add_subplot()提供了更为直观的接口,减少了对位置和大小参数的手动调整,有助于降低代码的复杂性。
缺点:
灵活性受限:
相对于add_axes()等方法,add_subplot()的灵活性较低。虽然适用于规律布局,但在需要非常定制化的布局时可能不够灵活。
位置和大小难以调整:
对于每个子图,你只能通过add_subplot()的参数来指定其在整个Figure中的位置,但无法直接控制其大小。如果有对子图位置和大小有更精细要求的情况,可能需要借助其他方法或手动调整。
不适用于复杂布局:
当需要在同一Figure中创建多个不同位置和大小的子图,并且布局较为复杂时,add_subplot()可能显得不够灵活。
总体来说,add_subplot()适用于相对简单的规律布局,提供了一个直观而易用的接口。然而,在需要更大灵活性和定制性的场景下,可能需要使用其他方法,例如add_axes()。选择使用哪种方法取决于你的具体需求和代码的复杂性
五 总结
到这里,我们对Matplotlib中的子图创建方法的学习就完成啦
在本博客中,我们深入了解了Matplotlib中的子图创建方法,主要聚焦于add_axes()和add_subplot()两种常用方法。这两种方法在创建子图时各具优缺点,选择合适的方法取决于具体的需求和布局要求。
综上所述,了解Matplotlib中的子图创建方法是使用该库进行数据可视化的关键一步。通过熟练掌握这些方法,我们能够更好地控制图形的外观和布局,提高可视化效果和表达能力。希望这篇博客能够为你在Matplotlib中创建子图提供清晰的指导,让您更加自如地进行数据展示和分析。
谢谢大家的阅读!
如果觉得这篇博客对你有用的话,别忘记三连哦。
我是甜美的江,让我们我们下次再见