1. ホーム
  2. python

[解決済み] matplotlib: AxesSubplot オブジェクトを作成して、Figure インスタンスに追加することはできますか?

2023-03-10 05:58:44

質問

を見ると matplotlib のドキュメントを見ると、どうやら標準的な方法は AxesSubplotFigure を使うのは Figure.add_subplot :

from matplotlib import pyplot

fig = pyplot.figure()
ax = fig.add_subplot(1,1,1)
ax.hist( some params .... )

を作成できるようにしたい。 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)

で可能でしょうか? matplotlib で可能なのでしょうか、また可能な場合、どのようにすればよいのでしょうか?

更新しました。 軸と図の作成を切り離すことはできませんでしたが、以下の回答にあるように、新規または古い図インスタンスで以前に作成した軸を簡単に再利用することができます。これは、簡単な関数で説明することができます。

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

どのように解決するのですか?

一般的には、軸のインスタンスを関数に渡すだけです。

例えば

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()

ご質問にお答えすると、いつもこのようなことができます。

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

また、軸のインスタンスを別の図に追加するだけでよい。

import matplotlib.pyplot as plt

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

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

plt.show()

他のサブプロット "shape"に一致するようにサイズを変更することも可能ですが、それは価値があるよりもすぐに多くのトラブルになりそうです。 私の経験では、図形や軸のインスタンス (またはインスタンスのリスト) を渡すだけのアプローチの方が、複雑なケースでははるかに単純です...。