将子图添加到现有图形?

Woo*_*ide 5 python matplotlib

我正在尝试使用 matplotlib。当网格形状已经存在时,我很难理解如何添加子图。

例如,如果我创建一个带有 2*2 子图网格的图形,我如何添加第 5 个或第 6 个。即如何更改几何形状以适应另一个子图。如果我这样做:

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True, sharey=True, facecolor='red', \
dpi = 100, edgecolor = 'red', linewidth = 5.0, frameon = True)
ax1.plot(x, y)
ax1.set_title('Sharing x per column, y per row')
ax2.scatter(x, y)
ax3.scatter(x, 2 * y ** 2 - 1, color='r')
ax4.plot(x, 2 * y ** 2 - 1, color='r')
Run Code Online (Sandbox Code Playgroud)

然后我想在下面添加另一个子图:

f.add_subplot(3, 2, 5)
Run Code Online (Sandbox Code Playgroud)

然后新的子图与第四个重叠,当我希望它明显位于下方时。我需要改变几何吗?如果是这样,如何?还是只是立场问题?

更一般地说,带有子情节的 **kwargs 发生了什么?如果有人能帮我弄清楚如何开始使用它们,那也会非常方便。

tre*_*ddy 1

我认为你应该改变绘图布局的几何形状的直觉是正确的。您首先指定一个 (2,2) 几何图形,即 2 行和 2 列,因此通过传统方式自然添加第五个图可能会导致一些问题。有多种方法可以解决这个问题,但最简单的解决方案之一就是通过使用第三行图为自己提供更大的子图网格 - 使用 (3,2) 几何图形,如下面的示例所示:

%pylab inline
import numpy as np
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
#probably easiest to add a third row of plots (3,2) at this stage:
f, ((ax1, ax2), (ax3, ax4),(ax5,ax6)) = plt.subplots(3, 2, sharex=True, sharey=True,    facecolor='red', \
dpi = 100, edgecolor = 'red', linewidth = 5.0, frameon = True)
ax1.plot(x, y)
ax1.set_title('Sharing x per column, y per row')
ax2.scatter(x, y)
ax3.scatter(x, 2 * y ** 2 - 1, color='r')
ax4.plot(x, 2 * y ** 2 - 1, color='r')
#now the fifth plot shouldn't clobber one of the others:
ax5.plot(x,y**3,color='g')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您希望第五个图占据整个底行,而不是在那里有一个空白的第六个图,您可以使用更高级的选项,如gridspec 文档matplotlib.gridspec中所述。