Matplotlib绘制子图到现有图形中

7

我想知道是否有一个相当的函数

fig, axarr = plt.subplots(3, 2, sharex='col', sharey='row')

当只为现有的图形生成轴数组时,而不是创建新的图形对象。我基本上需要创建一个matplotlib窗口,填充它,并在按下按钮后更新它。我想使用subplots方法,因为它允许共享轴,但它强制创建一个新的图形对象,这将打开一个新的窗口。

我目前的代码如下:

fig = plt.figure()

# When button is pressed
fig.clear()
for i in range(6):
    ax = fig.add_subplot(3, 2, i+1)
    ax.plot(x, y)
plt.draw()

我想做类似以下的事情:

fig, axarr = plt.subplots(3, 2, sharex='col', sharey='row')

# When button is pressed
fig.clear()
axarr = fig.subplots(3, 2, sharex='col', sharey='row')
for i in range(3):
    for j in range(2):
        ax = axarr[i][j]
        ax.plot(x, y)
plt.draw()

另外,有没有一种直接使用matplotlib窗口的方法?如果可能的话,我可以将新的图形对象绘制到现有窗口中。

如果使用PySide后端,则可能会有所不同。谢谢。


据我所知,您可以使用 fig, axarr = plt.subplots(...) 或手动创建图形并手动添加子图。如果我没记错的话,plt.subplots 实际上是在 pyplot 源代码中为您自动添加每个新轴,即根据您的第一个示例。 - pathoren
是的,但是subplots方法可以隐藏某些轴标签,并在使用缩放等交互工具时链接某些子图。我不确定如何复制这些行为。 - Neo
如果您想将两个子图链接在一起,可以在调用add_subplot时使用关键字参数sharex = ax_???sharey。例如,如果ax1已经创建,则可以使用语句ax2 = fig.add_subplots(2, 1, 2, sharex=ax1)实现链接。 - pathoren
2个回答

3

一个不太正规的解决方法:

你可以使用关键字num来明确指定图形句柄:

import matplotlib.pyplot as plt
fig1, axes1 = plt.subplots(5, 4, gridspec_kw={'top': 0.5}, num=1)
fig2, axes2 = plt.subplots(5, 4, gridspec_kw={'bottom': 0.5}, num=1)
plt.show()

这将会得到:
In [2]: fig1 is fig2
Out[2]: True

In [3]: axes1 is axes2
Out[3]: False

所有子图参数必须在开始时通过 grispec_kwsubplot_kw 参数进行设置。之后就不能轻易地进行更改了。

1
这个功能已经在主分支上实现通过PR#5146,目标是mpl 2.1,预计在秋季发布。
如果您现在需要它,请运行主分支或将该方法作为函数供应商。
axarr = vendored_subplots(fig, ...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接