将子图添加到现有图中?

时间:2013-11-23 11:50:32

标签: 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')

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

f.add_subplot(3, 2, 5)

然后新的子图与第四个重叠,当我希望它明显位于下方时。我需要更改几何图形吗?如果是这样,怎么样?或者它只是一个位置的东西?

更普遍的是,带有子情节的** kwargs会发生什么?如果有人可以帮我解决如何开始使用它们,那也非常方便。

1 个答案:

答案 0 :(得分:1)

我认为你应该改变绘图布局几何的直觉是正确的。您首先指定(2,2)几何形状,即2行和2列,因此通过常规方法自然添加第5个图可能会导致一些问题。有多种方法可以解决这个问题,但其中一个更简单的解决方案就是通过使用第三行图来给自己一个更大的子图网格 - 使用(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')

enter image description here

如果您希望第五个绘图占据整个底行而不是空白的第6个绘图,那么您可以使用gridspec documentation中描述的matplotlib.gridspec等更高级的选项。