如何使用 pyplot 使一个轴占据多个子图
我想在一个图中包含三个图。该图应具有二乘二的子图布局,其中第一个图应占据前两个子图单元格(即整个第一行图单元格),其他图应位于单元格 3 和 4 中第一个图的下方。
我知道 MATLAB 通过使用 subplot
命令来实现这一点,如下所示:
subplot(2,2,[1,2]) % the plot will span subplots 1 and 2
Is it also possible in pyplot to have a single axis attend more subplot? pyplot.subplot
的文档字符串没有谈论它。
有人有一个简单的解决方案吗?
I would like to have three plots in a single figure. The figure should have a subplot layout of two by two, where the first plot should occupy the first two subplot cells (i.e. the whole first row of plot cells) and the other plots should be positioned underneath the first one in cells 3 and 4.
I know that MATLAB allows this by using the subplot
command like so:
subplot(2,2,[1,2]) % the plot will span subplots 1 and 2
Is it also possible in pyplot to have a single axes occupy more than one subplot?
The docstring of pyplot.subplot
doesn't talk about it.
Anyone got an easy solution?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您可以简单地这样做:
即,第一个图实际上是上半部分的图(该图仅分为 2x1 = 2 个单元格),下面的两个较小的图是在 2x2=4 个单元格网格中完成的。
subplot() 的第三个参数是绘图在网格内的位置(以英语阅读的方向,单元格 1 位于左上角):
例如,在第二个子图 (
subplot(2, 2, 3)
) 中,轴将转到 2x2 矩阵的第三部分,即左下角。You can simply do:
i.e., the first plot is really a plot in the upper half (the figure is only divided into 2x1 = 2 cells), and the following two smaller plots are done in a 2x2=4 cell grid.
The third argument to
subplot()
is the position of the plot inside the grid (in the direction of reading in English, with cell 1 being in the top-left corner):for example in the second subplot (
subplot(2, 2, 3)
), the axes will go to the third section of the 2x2 matrix i.e, to the bottom-left corner.使用 Gridspec 制作多列/行子图布局展示了一种执行此操作的方法
GridSpec
。该示例的简化版本包含 3 个子图,如下所示The Using Gridspec to make multi-column/row subplot layouts shows a way to do this with
GridSpec
. A simplified version of the example with 3 subplots would look like要让多个子图占据一个轴,您可以简单地执行以下操作:
另一种方法是
To have multiple subplots with an axis occupy, you can simply do:
Another way is
更现代的答案是:最简单的可能是使用 subplots_mosaic:
https://matplotlib.org/stable/tutorials/provisional/mosaic.html
A more modern answer would be: Simplest is probably to use subplots_mosaic:
https://matplotlib.org/stable/tutorials/provisional/mosaic.html
对于更细粒度的控制,您可能需要使用
matplotlib.pyplot
的subplot2grid
模块。https://matplotlib.org/stable/api/gridspec_api.html
的一个示例GridSpec 实际应用: 使用 Gridspec 制作多列/行子图布局
For finer-grained control you might want to use the
subplot2grid
module ofmatplotlib.pyplot
.https://matplotlib.org/stable/api/gridspec_api.html
One example of GridSpec in action: Using Gridspec to make multi-column/row subplot layouts
matplotlib 中有三个主要选项可用于在图中绘制单独的图:
subplot
:访问轴数组并添加子图gridspec
:控制底层图形的几何属性(演示)子图
:将前两个包装在一个方便的 api 中(demo)到目前为止的帖子已经解决了前两个选项,但没有提到第三个,这是更现代的方法并且基于前两个选项。请参阅具体文档 使用子图和 GridSpec 组合两个子图。
更新
临时的
subplot_mosaic 可能是一个更好的改进@Jody Klymak 的帖子中提到的
方法。它使用结构性、可视化的方法来绘制子图,而不是令人困惑的数组索引。然而它仍然基于上面提到的后一种选择。There are three main options in matplotlib to make separate plots within a figure:
subplot
: access the axes array and add subplotsgridspec
: control the geometric properties of the underlying figure (demo)subplots
: wraps the first two in a convenient api (demo)The posts so far have addressed the first two options, but they have not mentioned the third, which is the more modern approach and is based on the first two options. See the specific docs Combining two subplots using subplots and GridSpec.
Update
A much nicer improvement may be the provisional
subplot_mosaic
method mentioned in @Jody Klymak's post. It uses a structural, visual approach to mapping out subplots instead of confusing array indices. However it is still based on the latter options mentioned above.我能想到两种更灵活的解决方案。
subplot_mosaic
。效果:
子图
的gridspec_kw
。虽然当不同的行需要不同的宽度比例时也很不方便。效果:
其他答案的
subplot
方法有点僵化,IMO。例如,您无法轻松创建宽度比为 1:2 和 2:1 的两行。但是,例如,当您需要覆盖子图
的某些布局时,它会有所帮助。I can think of 2 more flexible solutions.
subplot_mosaic
.Effect:
gridspec_kw
ofsubplots
. Although it is also inconvenient when different rows need different width ratios.Effect:
The
subplot
method of other answers is kind of rigid, IMO. For example, you cannot create two rows with width ratios being 1:2 and 2:1 easily. However, it can help when you need to overwrite some layout ofsubplots
, for example.