matplotlib 如何用pyplot使一个坐标轴占用多个子图

1tu0hz3e  于 2022-12-13  发布在  其他
关注(0)|答案(7)|浏览(197)

我想在一个图中有三个图。图的子图布局应该是2乘2,其中第一个图应该占据前两个子图单元格(即整个第一行图单元格),其他图应该位于第一个图下面的单元格3和4中。
我知道MATLAB通过使用subplot命令来实现这一点,如下所示:

subplot(2,2,[1,2]) % the plot will span subplots 1 and 2

在pyplot中是否也可以让一个轴占据多个子图?pyplot.subplot的文档串中没有提到这一点。
谁有简单的解决办法?

weylhg0b

weylhg0b1#

您可以简单地执行以下操作:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 7, 0.01)
    
plt.subplot(2, 1, 1)
plt.plot(x, np.sin(x))
    
plt.subplot(2, 2, 3)
plt.plot(x, np.cos(x))
    
plt.subplot(2, 2, 4)
plt.plot(x, np.sin(x)*np.cos(x))

也就是说,第一个图实际上是上半部分的图(图中只划分为2x1= 2个单元格),下面两个较小的图是在2x2=4个单元格的网格中完成的。subplot()的第三个参数是图在网格中的位置(按照英语阅读方向,单元格1位于左上角):例如,在第二子图(subplot(2, 2, 3))中,轴将到达2 × 2矩阵的第三部分,即到达左下角。

xpcnnkqh

xpcnnkqh2#

Using Gridspec to make multi-column/row subplot layouts显示了使用GridSpec执行此操作的方法。

import matplotlib.pyplot as plt

fig = plt.figure()

gs = fig.add_gridspec(2,2)
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, :])

plt.show()

pinkon5k

pinkon5k3#

要使多个子绘图区占用一个轴,只需执行以下操作:

from matplotlib import pyplot as plt
import numpy as np

b=np.linspace(-np.pi, np.pi, 100)

a1=np.sin(b)

a2=np.cos(b)

a3=a1*a2

plt.subplot(221)
plt.plot(b, a1)
plt.title('sin(x)')

plt.subplot(222)
plt.plot(b, a2)
plt.title('cos(x)')

plt.subplot(212)
plt.plot(b, a3)
plt.title('sin(x)*cos(x)')

plt.show()

另一种方法是

plt.subplot(222)
plt.plot(b, a1)
plt.title('sin(x)')

plt.subplot(224)
plt.plot(b, a2)
plt.title('cos(x)')

plt.subplot(121)
plt.plot(b, a3)
plt.title('sin(x)*cos(x)')

plt.show()

pod7payv

pod7payv4#

对于更细粒度的控制,您可能希望使用matplotlib.pyplotsubplot2grid模块。
http://matplotlib.org/users/gridspec.html

e37o9pze

e37o9pze5#

一个更现代的答案是:最简单的可能是使用subplots_mosaic:https://matplotlib.org/stable/tutorials/provisional/mosaic.html

import matplotlib.pyplot as plt
import numpy as np

# Some example data to display
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

fig, axd = plt.subplot_mosaic([['left', 'right'],['bottom', 'bottom']],
                              constrained_layout=True)
axd['left'].plot(x, y, 'C0')
axd['right'].plot(x, y, 'C1')
axd['bottom'].plot(x, y, 'C2')
plt.show()

cvxl0en2

cvxl0en26#

matplotlib中有三个主要选项可用于在图形中绘制单独的图:

  1. subplot:访问axes数组并添加子绘图
  2. gridspec:控制基础图形的几何性质(demo
  3. subplots:将前两个封装在一个方便的API中(demo
    到目前为止,这些帖子已经讨论了前两个选项,但他们还没有提到第三个,这是一个更现代的方法,基于前两个选项。请参阅特定的文档 * 使用子情节和GridSpec* 组合两个子情节。

更新

一个更好的改进可能是@ JodyKlymak的帖子中提到的临时subplot_mosaic方法。它使用一种结构化的、可视化的方法来绘制子情节,而不是混乱的数组索引。然而,它仍然基于上面提到的后一种方法。

xzv2uavs

xzv2uavs7#

我能想到两个更灵活的解决方案。
1.最灵活的方式:使用subplot_mosaic

f, axes = plt.subplot_mosaic('AAB;CDD;EEE')
# axes = {'A': ..., 'B': ..., ...}

效果:

1.使用subplotsgridspec_kw。虽然当不同的行需要不同的宽度比时也不方便。

f, (a0, a1) = plt.subplots(1, 2, gridspec_kw={'width_ratios': [2, 1]})

效果:

其他答案的subplot方法有点死板。例如,你不能轻松地创建宽度比为1:2和2:1的两行。但是,当你需要覆盖subplots的一些布局时,它会有所帮助。

相关问题