【100天精通Python】Day63:Python可视化_Matplotlib绘制子图,子图网格布局属性设置等示例+代码

2023-09-16 17:35:43

 目录

1 基本子图绘制示例

2 子图网格布局

3 调整子图的尺寸

4 多行多列的子图布局

5 子图之间的共享轴

6 绘制多个子图类型

7 实战:

绘制一个大图,里面包含6个不同类别的子图,不均匀布局。


绘制子图(subplots)是在Matplotlib中创建多个子图的常见任务。通过子图,您可以将多个图形放置在同一图表中,以便比较不同的数据或可视化多个相关的图形。一般流程如下:

  1. 创建图形对象:首先,您需要创建一个图形对象,可以使用plt.figure()函数来完成。该图形对象代表整个图形窗口,您可以在其中放置多个子图。

  2. 添加子图:使用fig.add_subplot()函数来添加子图。这个函数接受三个参数,分别是行数、列数和子图的索引位置。例如,fig.add_subplot(2, 2, 1)表示将创建一个2x2的网格,并在第一个位置创建子图。

  3. 绘制图表:在每个子图中,您可以使用Matplotlib的绘图函数(如plot()scatter()bar()等)来绘制不同类型的图表。

  4. 子图属性设置:您可以设置每个子图的标题、坐标轴标签、背景颜色、图例等属性,以使其更具可读性和吸引力。

  5. 调整子图布局:Matplotlib允许您调整子图之间的间距,以便更好地组织和排列它们。可以使用plt.subplots_adjust()函数来完成这个任务。

  6. 显示图形:一旦您创建并设置了所有子图,使用plt.show()函数来显示整个图形。

1 基本子图绘制示例

首先,让我们看一个基本的子图绘制示例。使用plt.subplots()函数,您可以创建一个包含多个子图的图表,并将这些子图放置在一个网格中。以下是一个基本的示例:

import matplotlib.pyplot as plt
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建一个包含两个子图的图表
fig, axes = plt.subplots(nrows=1, ncols=2)

# 在第一个子图中绘制正弦函数
axes[0].plot(x, y1, label='Sine Function', color='blue')
axes[0].set_title('Sine Function')

# 在第二个子图中绘制余弦函数
axes[1].plot(x, y2, label='Cosine Function', color='red')
axes[1].set_title('Cosine Function')

# 显示图例
axes[0].legend()
axes[1].legend()

# 显示图形
plt.show()

运行:

        以上代码演示了如何使用Matplotlib创建一个包含两个子图的图表。这两个子图分别显示了正弦函数和余弦函数的曲线。

  1. 导入Matplotlib库和NumPy库。
  2. 创建示例数据,使用NumPy的linspace函数生成0到2π之间的100个点作为x轴数据,同时计算对应的正弦值和余弦值作为y轴数据。
  3. 使用plt.subplots函数创建一个图表和一个由子图对象组成的数组。其中nrows=1表示创建一个行数为1,列数为2的图表。
  4. 在第一个子图中绘制正弦函数曲线,使用plot函数,并指定标签(label)和颜色(color)。同时设置标题(set_title)为"Sine Function"。
  5. 在第二个子图中绘制余弦函数曲线,同样使用plot函数,并指定标签和颜色。设置标题为"Cosine Function"。
  6. 显示图例,使用legend函数,在每个子图中显示曲线的标签。
  7. 最后调用plt.show()来显示图形。

2 子图网格布局

        Matplotlib还允许您以更复杂的方式布局子图,以满足您的需求。您可以使用gridspec模块来实现更灵活的子图布局。以下是一个示例,演示如何使用gridspec创建子图网格:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)

# 创建一个包含多个子图的图表,使用gridspec定义子图布局
fig = plt.figure(figsize=(10, 4))
gs = gridspec.GridSpec(1, 3)  # 1行3列的子图布局

# 第一个子图
ax1 = plt.subplot(gs[0, 0])
ax1.plot(x, y1, label='Sine Function', color='blue')
ax1.set_title('Sine Function')
ax1.legend()

# 第二个子图
ax2 = plt.subplot(gs[0, 1])
ax2.plot(x, y2, label='Cosine Function', color='red')
ax2.set_title('Cosine Function')
ax2.legend()

# 第三个子图
ax3 = plt.subplot(gs[0, 2])
ax3.plot(x, y3, label='Tangent Function', color='green')
ax3.set_title('Tangent Function')
ax3.legend()

# 调整子图之间的距离
plt.tight_layout()

# 显示图形
plt.show()

运行: 

        这个示例创建了一个包含三个子图的图表,使用gridspec模块定义了子图的布局。每个子图包含不同的三角函数,并具有自己的标题和图例。

  1. 导入Matplotlib库和NumPy库。
  2. 创建示例数据,使用NumPy的linspace函数生成0到2π之间的100个点作为x轴数据,同时计算对应的正弦、余弦和正切值作为y轴数据。
  3. 创建一个Figure对象,设置图表的大小为(10, 4)。
  4. 使用gridspec.GridSpec函数创建一个网格布局,指定1行3列的子图布局。
  5. 在第一个子图(ax1)中绘制正弦函数曲线,使用plot函数,并指定标签(label)和颜色(color)。同时设置标题(set_title)为"Sine Function"并显示图例(legend)。
  6. 在第二个子图(ax2)中绘制余弦函数曲线,同样使用plot函数,并指定标签和颜色。设置标题为"Cosine Function"并显示图例。
  7. 在第三个子图(ax3)中绘制正切函数曲线,同样使用plot函数,并指定标签和颜色。设置标题为"Tangent Function"并显示图例。
  8. 调用plt.tight_layout()函数来自动调整子图之间的距离。
  9. 最后调用plt.show()来显示图形。

3 调整子图的尺寸

以下是一些常用的参数,用于调整子图的尺寸和位置:

  1. nrowsncols:这两个参数用于指定子图的网格布局的行数和列数。例如,fig.add_subplot(2, 2, 1)表示一个2x2的网格布局,其中有4个子图。

  2. index:该参数指定子图在网格中的位置。例如,fig.add_subplot(2, 2, 1)表示在2x2的网格中的第一个位置创建子图。

  3. position:通过position参数,您可以设置子图的位置和大小,它是一个四元组,表示子图的左、下、宽度和高度。例如,fig.add_subplot(position=[0.1, 0.1, 0.8, 0.8])表示在图形中创建一个左上角偏移10%并且宽度和高度都为80%的子图。

  4. projection:用于指定子图的投影类型,例如3D子图、极坐标子图等。

  5. polar:一个布尔值,用于指定子图是否使用极坐标。默认为False。

您可以通过设置gridspec中每个子图的相对宽度来调整子图的尺寸。以下示例将第一个子图的宽度设置为其他两个子图的两倍:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)

# 创建一个包含多个子图的图表,使用gridspec定义子图布局
fig = plt.figure(figsize=(12, 4))

 # 1行3列的子图布局,第一个子图宽度为其他两个的两倍
gs = gridspec.GridSpec(1, 3, width_ratios=[2, 1, 1]) 

# 第一个子图
ax1 = plt.subplot(gs[0, 0])
ax1.plot(x, y1, label='Sine Function', color='blue')
ax1.set_title('Sine Function')
ax1.legend()

# 第二个子图
ax2 = plt.subplot(gs[0, 1])
ax2.plot(x, y2, label='Cosine Function', color='red')
ax2.set_title('Cosine Function')
ax2.legend()

# 第三个子图
ax3 = plt.subplot(gs[0, 2])
ax3.plot(x, y3, label='Tangent Function', color='green')
ax3.set_title('Tangent Function')
ax3.legend()

# 调整子图之间的距离
plt.tight_layout()

# 显示图形
plt.show()

         以上代码演示了如何使用Matplotlib创建一个包含多个子图的图表,并使用gridspec来定义子图布局。代码的步骤如下:

  1. 导入Matplotlib库和NumPy库。
  2. 创建示例数据,使用NumPy的linspace函数生成0到2π之间的100个点作为x轴数据,同时计算对应的正弦、余弦和正切值作为y轴数据。
  3. 创建一个Figure对象,设置图表的大小为(12, 4)。
  4. 使用gridspec.GridSpec函数创建一个网格布局,指定1行3列的子图布局,并通过width_ratios参数设置第一个子图的宽度为其他两个子图的两倍。
  5. 在第一个子图(ax1)中绘制正弦函数曲线,使用plot函数,并指定标签(label)和颜色(color)。同时设置标题(set_title)为"Sine Function"并显示图例(legend)。
  6. 在第二个子图(ax2)中绘制余弦函数曲线,同样使用plot函数,并指定标签和颜色。设置标题为"Cosine Function"并显示图例。
  7. 在第三个子图(ax3)中绘制正切函数曲线,同样使用plot函数,并指定标签和颜色。设置标题为"Tangent Function"并显示图例。
  8. 调用plt.tight_layout()函数来自动调整子图之间的距离。
  9. 最后调用plt.show()来显示图形。

4 多行多列的子图布局

        您可以使用gridspec创建多行多列的子图布局,以便在一个图表中组织更多的子图。以下示例演示了一个包含多行多列子图的图表:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

# 创建一个包含多行多列子图的图表,使用gridspec定义子图布局
fig = plt.figure(figsize=(10, 6))
gs = gridspec.GridSpec(3, 2)  # 3行2列的子图布局

# 绘制多行多列的子图
for i in range(3):
    for j in range(2):
        ax = plt.subplot(gs[i, j])
        ax.plot(x, y, label='Sine Function', color='blue')
        ax.set_title(f'Subplot ({i+1}, {j+1})')
        ax.legend()

# 调整子图之间的距离
plt.tight_layout()

# 显示图形
plt.show()

运行: 

5 子图之间的共享轴

        您可以通过设置sharexsharey参数来共享子图之间的X轴或Y轴。以下示例演示了在子图之间共享X轴的情况:

import matplotlib.pyplot as plt
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建一个包含多个子图的图表
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))

# 第一个子图,共享X轴
ax1.plot(x, y1, label='Sine Function', color='blue')
ax1.set_title('Shared X-Axis')
ax1.legend()

# 第二个子图,共享X轴
ax2.plot(x, y2, label='Cosine Function', color='red')
ax2.legend()

# 调整子图之间的距离
plt.tight_layout()

# 显示图形
plt.show()

运行: 

共享Y轴示例:

        在这个示例中,我们创建了两个子图,通过sharey=True参数来共享Y轴。这两个子图分别绘制了sin函数和cos函数,并共享相同的Y轴刻度。整体标题用suptitle函数添加。这个示例演示了如何创建共享Y轴的子图。代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 创建示例数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 创建两个子图,共享Y轴
fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(10, 4))

# 在第一个子图上绘制sin函数
ax1.plot(x, y1, label='Sine Function', color='blue', linestyle='--')
ax1.set_title('Subplot 1: Sine Function')
ax1.set_xlabel('X-axis')
ax1.set_ylabel('Y-axis')
ax1.legend()

# 在第二个子图上绘制cos函数
ax2.plot(x, y2, label='Cosine Function', color='red', linestyle='-')
ax2.set_title('Subplot 2: Cosine Function')
ax2.set_xlabel('X-axis')
ax2.legend()

# 添加整体标题
plt.suptitle('Two Subplots Sharing Y-Axis', fontsize=16, fontweight='bold')

# 显示图形
plt.show()

运行: 

6 绘制多个子图类型

        您可以在同一个图表中组合不同类型的子图,例如线图和散点图。以下示例演示了如何在同一图表中绘制多个子图类型:

import matplotlib.pyplot as plt
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
x_scatter = np.random.rand(50) * 2 * np.pi
y_scatter = np.sin(x_scatter)

# 创建一个包含多个子图的图表
fig, axs = plt.subplots(2, 2, figsize=(10, 6))

# 第一个子图:线图
axs[0, 0].plot(x, y1, label='Sine Function', color='blue')
axs[0, 0].set_title('Line Plot')
axs[0, 0].legend()

# 第二个子图:散点图
axs[0, 1].scatter(x_scatter, y_scatter, label='Scatter Points', color='red', marker='o')
axs[0, 1].set_title('Scatter Plot')
axs[0, 1].legend()

# 第三个子图:线图
axs[1, 0].plot(x, y2, label='Cosine Function', color='green')
axs[1, 0].set_title('Line Plot')
axs[1, 0].legend()

# 第四个子图:散点图
axs[1, 1].scatter(x_scatter, y_scatter, label='Scatter Points', color='purple', marker='s')
axs[1, 1].set_title('Scatter Plot')
axs[1, 1].legend()

# 调整子图之间的距离
plt.tight_layout()

# 显示图形
plt.show()

运行: 

  1. 导入Matplotlib库和NumPy库。
  2. 创建示例数据,使用NumPy的linspace函数生成0到2π之间的100个点作为x轴数据,并计算对应的正弦值和余弦值作为y轴数据。还生成了50个随机点用于绘制散点图。
  3. 创建一个包含2行2列子图的图表,使用 ​subplots​函数并设置 ​figsize​参数指定图表的大小。​subplots​函数会返回一个Figure对象和一个包含子图的Axes对象的二维数组。
  4. 在第一个子图(axs[0, 0])中绘制正弦函数的线图,使用 ​plot​函数,并指定标签(label)和颜色(color)。设置标题(set_title)为"Line Plot"并显示图例(legend)。
  5. 在第二个子图(axs[0, 1])中绘制散点图,使用 ​scatter​函数,并指定标签、颜色和标记(marker)类型。同样设置标题和图例。
  6. 在第三个子图(axs[1, 0])中绘制余弦函数的线图,使用 ​plot​函数,并指定标签和颜色。设置标题和图例。
  7. 在第四个子图(axs[1, 1])中绘制散点图,使用 ​scatter​函数,并指定标签、颜色和标记类型。同样设置标题和图例。
  8. 使用 ​tight_layout​函数调整子图之间的距离,使其更美观。
  9. 调用 ​show​函数显示图形。

7 实战:

绘制一个大图,里面包含6个不同类别的子图,不均匀布局。

第一行放一个子图,第二行放两个子图 ,第三行放三个子图 ,分别自适应设置子图的尺寸和背景色,示例与代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 创建示例数据
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

# 创建图形
fig = plt.figure(figsize=(12, 8))

 # 在上方添加母图标题
fig.suptitle('Customized Subplots Example', fontsize=16, fontweight='bold') 

# fig.suptitle('Customized Subplots Example', fontsize=16, fontweight='bold', y=0.05) # 在下方添加母图标题

# 调整子图的布局,增加垂直间距,避免子图之间有交叉
plt.subplots_adjust(hspace=0.5)

# 第一行,一个子图,绘制线图
ax1 = fig.add_subplot(3, 1, 1)
ax1.plot(x, y, color='blue', label='Sine Function', linewidth=2, linestyle='--', marker='o', markersize=5)
ax1.set_title('Line Plot', fontsize=14)
ax1.set_facecolor('lightgray')
ax1.set_xlabel('X-axis', fontsize=12)
ax1.set_ylabel('Y-axis', fontsize=12)
ax1.legend()

# 添加注释
ax1.annotate('Peak Point', xy=(np.pi/2, 1), xytext=(np.pi/2, 1.2),
             arrowprops=dict(facecolor='black', shrink=0.05),
             fontsize=12, bbox=dict(boxstyle='round,pad=0.3', edgecolor='black', facecolor='yellow'))

# 第二行,两个子图,一个散点图,一个柱状图
ax2 = fig.add_subplot(3, 2, 3)
ax2.scatter(x, y, color='red', label='Scatter Plot', s=20)
ax2.set_title('Scatter Plot', fontsize=14)
ax2.set_facecolor('lightyellow')
ax2.set_xlabel('X-axis', fontsize=12)
ax2.set_ylabel('Y-axis', fontsize=12)
ax2.legend()

ax3 = fig.add_subplot(3, 2, 4)
ax3.bar(x, y, color='green', label='Bar Plot', alpha=0.7)
ax3.set_title('Bar Plot', fontsize=14)
ax3.set_facecolor('lightgreen')
ax3.set_xlabel('X-axis', fontsize=12)
ax3.set_ylabel('Y-axis', fontsize=12)
ax3.legend()

# 第三行,三个子图,一个直方图,一个饼图,一个箱线图
ax4 = fig.add_subplot(3, 3, 7)
ax4.hist(y, bins=20, color='purple', label='Histogram', alpha=0.7)
ax4.set_title('Histogram', fontsize=14)
ax4.set_facecolor('lightpink')
ax4.set_xlabel('X-axis', fontsize=12)
ax4.set_ylabel('Frequency', fontsize=12)
ax4.legend()

ax5 = fig.add_subplot(3, 3, 8)
ax5.pie([len(y[y > 0]), len(y[y < 0])], labels=['Positive', 'Negative'], colors=['orange', 'lightblue'], autopct='%1.1f%%')
ax5.set_title('Pie Chart', fontsize=14)
ax5.set_facecolor('lightcoral')
ax5.legend()

ax6 = fig.add_subplot(3, 3, 9)
ax6.boxplot(y, vert=False, widths=0.3, patch_artist=True, boxprops=dict(facecolor='lightgray'))
ax6.set_title('Box Plot', fontsize=14)
ax6.set_facecolor('lightblue')
ax6.set_xlabel('X-axis', fontsize=12)
ax6.legend([])  # 添加空的图例以解决警告

# 调整子图布局
plt.tight_layout()

# 显示图形
plt.show()

运行:

上面的示例代码演示了如何创建一个包含不同类型子图的图形,并对每个子图进行了定制化设置。代码流程:

  1. 创建示例数据:使用numpy生成示例数据,这里生成了一个sin函数的数据。

  2. 创建图形对象:使用plt.figure()创建一个图形对象,可以设置图形的大小。

  3. 添加母图标题:使用fig.suptitle()可以为整个图形添加一个标题。

  4. 调整子图的布局:使用plt.subplots_adjust()可以调整子图之间的间距,这里增加了垂直间距。

  5. 创建子图:使用fig.add_subplot()创建子图,指定子图的位置和数量

  6. 绘制不同类型的子图:根据需要,创建不同类型的子图,如线图、散点图、柱状图、直方图、饼图、箱线图等。

  7. 设置子图的标题、背景色、坐标轴标签和图例:使用set_title()set_facecolor()set_xlabel()set_ylabel()legend()方法来设置子图的各种属性。

  8. 添加注释:使用annotate()方法可以在子图上添加注释。

  9. 调整子图布局:使用plt.tight_layout()可以自动调整子图的布局,使其适应图形大小。

  10. 显示图形:使用plt.show()显示最终的图形。

这个示例演示了如何在一个图形中创建多个子图,并对每个子图进行不同的设置和绘制不同类型的图表。

更多推荐

Python爬虫深度优化:Scrapy库的高级使用和调优

在我们前面的文章中,我们探索了如何使用Scrapy库创建一个基础的爬虫,了解了如何使用选择器和Item提取数据,以及如何使用Pipelines处理数据。在本篇高级教程中,我们将深入探讨如何优化和调整Scrapy爬虫的性能,以及如何处理更复杂的抓取任务,如登录,处理Cookies和会话,以及避免爬虫被网站识别和封锁。一、

探索人工智能 | 计算机视觉 让计算机打开新灵之窗

前言计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。文章目录前言主题原理常用算法CNNSVM应用自动驾驶医学影像分析无人机和机器人小结面临挑战总结主题计算机视觉既是工程领域

OpenCV实战(27)——追踪视频中的特征点

OpenCV实战(27)——追踪视频中的特征点0.前言1.追踪视频中的特征点2.特征点追踪原理3.完整代码小结系列链接0.前言我们已经知道可以通过一些最独特的点来分析图像,对于图像序列同样如此,其中一些特征点的运动可用于了解捕获场景的不同元素如何移动。在本节中,我们将学习如何在特征点逐帧移动时通过跟踪特征点来执行序列的

Hadoop生态圈中的数据同步工具SQOOP

Hadoop生态圈中的数据同步工具SQOOP一、sqoop的概念二、sqoop的核心功能1、数据导入import2、数据导出export三、sqoop的底层实现四、sqoop的安装和部署五、sqoop的基本操作1、sqoop查看RDBMS中有哪些数据库2、sqoop查看某一个数据库下有哪些数据表3、通过sqoop执行s

Oracle,高斯创建自增序列

某些时候,需要获取到一个自增值然后点击左下Apply也可以通过SQL语句执行dual在Oracle中是张虚拟表,通常用于执行这样的查询Oracle中查询语句:select序列名.nextvalfromdual在高斯数据库中:查询是selectmy_sequence.nextval不需要加formxxx例如:Oracle

JVM 第一章:Java运行时数据区

目录一.了解JVM1.1什么是JVM1.2JRE/JDK/JVM1.3JVM的整体结构二.Java运行时数据区2.1程序计数器(PC寄存器)2.2Java虚拟机栈(JavaVirtualMachineStacks)2.2.1栈帧的组成2.2.2问题辨析2.2.3逃逸分析①栈上分配②标量分析③同步消除2.2.4内存溢出2

IP代理与加速器:理解它们的区别与共同点

目录一、IP代理的基本概念与作用1、IP代理的定义2、IP代理的作用二、加速器的基本概念与作用1、加速器的定义2、加速器的作用三、IP代理与加速器的异同点1、相同点2、不同点四、都有什么优缺点五、各自在什么场合下使用六、该怎么选择总结在互联网的汪洋大海中,我们有时会遇到各种网络问题,如地区限制、网络延迟、封锁等。这时,

网页订货系统的诸多优势|企业APP订单管理软件

1.订单信息,发货信息,账目信息一目了然生产企业(总代理)和分销商之间可以清楚直观的了解到商品和货款的实时状态,以便高效的订货,发货,进行货款催收以及商品的物流跟踪。2.建立稳固的客户关系,避免客户被竞争对手挖墙脚有了网上订货系统,企业(总代理)和分销商之间的联系更加紧密,账目更加清晰,客户信任度和忠诚度大大提升,有效

单片机操作系统,按键与FIFO

前言1.之前做按键,在中断判断并进入回调函数,但是经常会导致其他任务来不及处理,或者是按键触发了但没有执行回调,即用户操作时感觉按键失灵。2.这里更新了一下代码,思路是这样的:中断进入按键扫描,有消抖,不阻塞,如果按键事件触发时即入列,然后操作系统每隔10ms进行一次轮询,若队列不为空,则出列并执行按键回调。有纰漏请指

AI AIgents时代-(四.)应用上手

HuggingGPT&MetaGPT.🟢HuggingGPTHuggingGPT是一个多模型调用的Agent框架,利用ChatGPT作为任务规划器,根据每个模型的描述来选择HuggingFace平台上可用的模型,最后根据模型的执行结果生成总结性的响应。这个项目目前已在Github上开源,并且有一个非常酷的名字叫做JA

python经典百题之统计字符数

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。方法一:str_input=input("请输入一行字符:")count_letter,count_space,count_digits,count_other=0,0,0,0forcharinstr_input:ifchar.isalpha():

热文推荐