matplotlib:我可以创建AxesSubplot对象,然后将它们添加到Figure实例中吗?

jua*_*nza 62 python matplotlib

查看matplotlib文档,似乎添加AxesSubplot到a 的标准方法Figure是使用Figure.add_subplot:

from matplotlib import pyplot

fig = pyplot.figure()
ax = fig.add_subplot(1,1,1)
ax.hist( some params .... )
Run Code Online (Sandbox Code Playgroud)

我希望能够AxesSubPlot独立于图形创建类似对象,因此我可以在不同的图中使用它们.就像是

fig = pyplot.figure()
histoA = some_axes_subplot_maker.hist( some params ..... )
histoA = some_axes_subplot_maker.hist( some other params ..... )
# make one figure with both plots
fig.add_subaxes(histo1, 211)
fig.add_subaxes(histo1, 212)
fig2 = pyplot.figure()
# make a figure with the first plot only
fig2.add_subaxes(histo1, 111)
Run Code Online (Sandbox Code Playgroud)

这是可能的matplotlib,如果可以,我该怎么做?

更新:我还没有设法解除Axes和Figures的创建,但是下面的答案中的示例可以很容易地在new或olf Figure实例中重用以前创建的轴.这可以通过一个简单的功能来说明:

def plot_axes(ax, fig=None, geometry=(1,1,1)):
    if fig is None:
        fig = plt.figure()
    if ax.get_geometry() != geometry :
        ax.change_geometry(*geometry)
    ax = fig.axes.append(ax)
    return fig
Run Code Online (Sandbox Code Playgroud)

Joe*_*ton 28

通常,您只需将轴实例传递给函数.

例如:

import matplotlib.pyplot as plt
import numpy as np

def main():
    x = np.linspace(0, 6 * np.pi, 100)

    fig1, (ax1, ax2) = plt.subplots(nrows=2)
    plot(x, np.sin(x), ax1)
    plot(x, np.random.random(100), ax2)

    fig2 = plt.figure()
    plot(x, np.cos(x))

    plt.show()

def plot(x, y, ax=None):
    if ax is None:
        ax = plt.gca()
    line, = ax.plot(x, y, 'go')
    ax.set_ylabel('Yabba dabba do!')
    return line

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

要回答您的问题,您可以随时执行以下操作:

def subplot(data, fig=None, index=111):
    if fig is None:
        fig = plt.figure()
    ax = fig.add_subplot(index)
    ax.plot(data)
Run Code Online (Sandbox Code Playgroud)

此外,您只需将轴实例添加到另一个图形:

import matplotlib.pyplot as plt

fig1, ax = plt.subplots()
ax.plot(range(10))

fig2 = plt.figure()
fig2.axes.append(ax)

plt.show()
Run Code Online (Sandbox Code Playgroud)

调整大小以匹配其他子图"形状"也是可能的,但它会很快变得比它的价值更麻烦.根据我的经验,简单地传递一个数字或轴实例(或实例列表)的方法对于复杂的情况要简单得多......

  • @aaren - 它不起作用,因为在较新版本的matplotlib中,数字的轴堆栈的工作方式已经改变.故意不应该在不同的数字之间共享轴.作为一种解决方法,您可以执行此操作`fig2._axstack.add(fig2._make_key(a),a)`,但它是hackish并且可能在将来发生变化.它似乎工作正常,但它可能会破坏一些东西. (12认同)
  • 10 年后,我仍然想知道为什么我坚持使用“matplotlib” (5认同)
  • 将轴实例添加到另一个图形(最后一个示例)在Enthought 7.3-2(matplotlib 1.1.0)中对我不起作用. (3认同)

Imp*_*est 13

以下显示如何将轴从一个图形"移动"到另一个图形.这是@ JoeKington最后一个例子的预期功能,它在较新的matplotlib版本中不再起作用,因为轴不能同时存在于几个数字中.

您首先需要从第一个图中移除轴,然后将其附加到下一个图并给它一些位置.

import matplotlib.pyplot as plt

fig1, ax = plt.subplots()
ax.plot(range(10))
ax.remove()

fig2 = plt.figure()
ax.figure=fig2
fig2.axes.append(ax)
fig2.add_axes(ax)

dummy = fig2.add_subplot(111)
ax.set_position(dummy.get_position())
dummy.remove()
plt.close(fig1)

plt.show()
Run Code Online (Sandbox Code Playgroud)

  • @irene请注意,此解决方案仅将轴移动到新图形,它不设置任何变换。因此,此类问题是预料之中的。由于不鼓励在图形之间移动艺术家,因此如果您需要可靠的输出,最好不要使用此功能。 (2认同)