matplotlib 如何绘制具有不同列跨度的四个子区?

fcg9iug3  于 2023-02-05  发布在  其他
关注(0)|答案(3)|浏览(199)

我尝试使用matplotlib.pyplot拟合四个图像,如下所示:

| plot1 | plot2|
|    plot3     |
|    plot4     |

我发现的大多数例子都包含了如下三个情节:

ax1 = plt.subplot(221)
ax2 = plt.subplot(222)
ax3 = plt.subplot(212)

这样就成功地绘制了三个图(但是,我不知道ax3是如何绘制的)。现在,我想把图4添加到这个排列中。无论我尝试什么,我都不能成功。
你能告诉我怎样才能做到吗?

mmvthczy

mmvthczy1#

你可以用subplot2grid,真的很方便。
医生说
在网格中创建子绘图区。网格由形状、位置、跨行、跨列单元格在每个方向指定。位置的索引从0开始。
首先,在此根据行数和列数(3,2)定义大小。然后,定义特定子区的起始(行、列)位置。然后,指定该特定子区跨越的行数/列数。行和列跨越的关键字分别为rowspancolspan

import matplotlib.pyplot as plt

ax1 = plt.subplot2grid((3, 2), (0, 0), colspan=1)
ax2 = plt.subplot2grid((3, 2), (0, 1), colspan=1)
ax3 = plt.subplot2grid((3, 2), (1, 0), colspan=2)
ax4 = plt.subplot2grid((3, 2), (2, 0), colspan=2)
plt.tight_layout()

7vhp5slm

7vhp5slm2#

您提供给子图的整数实际上是3部分:

  • 第一位数字:行数
  • 第二位数字:列数
  • 第三位数字:指标

因此,对于每次调用子图,我们指定如何划分图区域(使用行和列),然后将图放置在哪个区域(使用索引),见下图。

ax1 = plt.subplot(321)  # 3 rows, 2 cols, index 1: col 1 on row 1
ax2 = plt.subplot(322)  # 3 rows, 2 cols, index 2: col 2 on row 1
ax3 = plt.subplot(312)  # 3 rows, 1 cols, index 2: col 1 on row 2
ax4 = plt.subplot(313)  # 3 rows, 1 cols, index 3: col 1 on row 3

docs
一个3位数整数或三个单独的整数,用于描述子区的位置。如果三个整数依次为nrows、ncols和index,则子区将在具有nrows行和ncols列的网格上占据索引位置。index从左上角的1开始,向右递增。
pos是一个三位数的整数,其中第一位数是行数,第二位数是列数,第三位数是子图的索引。即,图add_subplot(235)与图add_subplot(2,3,5)相同。注意,所有整数必须小于10,此形式才能工作。
第一节第一节第一节第一节第一次

bd1hkmkf

bd1hkmkf3#

在较新版本的matplotlib中,可以使用subplot_mosaic,如下所示:

fig, axes = plt.subplot_mosaic("AB;CC;DD")

它在此结构中提供了四个子图:

AB          | A | B |
AB;CC;DD    ->    CC    ->    |   C   |
                  DD          |   D   |

要避免标签重叠,请启用constrained_layout

fig, axes = plt.subplot_mosaic("AB;CC;DD", constrained_layout=True)

相关问题