1

独立したスクリプトによって生成されたいくつかの図があり、各パネルのカスタム軸 (位置とサイズ) を使用して 1 つの複雑な図にまとめたいと考えています。これまでのところ、このアプローチは matplotlib で十分にサポートされていないようですが、試してみることにしました。

現在、各図を必要なパネルにコピーできますが、「コピーされた」図は何らかの形でクリップされ、軸が台無しになっています。そして率直に言って、私はmatplotlibに比較的慣れていないので、何が欠けているのかわかりません(たとえば、Matlabではcopyobj()がトリックを実行していたでしょう)。

以下は、テストに使用しているサンプルコードです。

def customfigure(flist,axlist):
    # Margins
    lm = 0.05
    rm = 0.05
    bm = 0.05
    tm = 0.05

    # basic grid
    nrow = 2
    ncol = 2

    # rulers
    hr = 0.02
    vr = 0.02

    # axis width
    aw = (1-lm-rm-(ncol-1)*hr)/ncol
    # axis height
    ah = (1-tm-bm-(nrow-1)*vr)/nrow

    # Make axis box
    ax = [None]*(ncol*nrow)
    ax[0] = [lm,bm,aw,ah]
    ax[1] = [lm,bm+ah+vr,aw,ah]
    ax[2] = [lm+aw+hr,bm,aw,ah]
    ax[3] = [lm+aw+hr,bm+ah+vr,aw,ah]

    fig = plt.figure(figsize=(10,6),dpi=80)
    # Solution 1
    for i in xrange(len(axlist)):
        axlist[i].set_position(ax[i])
        axlist[i].set_figure(fig)
        flist[i].delaxes(axlist[i])        
        fig.add_axes(axlist[i])

close('all')
fig = [None]*4
ax = [None]*4
x = array([range(10)])

close('all')
fig = [None]*4
ax = [None]*4

t = arange(0.0, 2.0, 0.01)
color = ['k','r','g','b']
for i in xrange(4):
    fig[i],ax[i] = plt.subplots()
    s = sin(2*(i+1)*pi*t)
    plt.plot(t, s,'-',color=color[i])
    show()

customfigure(fig,ax)

customfigure() によって作成された最終的な図 (残念ながら、初心者としてここに貼り付けることができません) には、この図に少なくとも 2 つの問題があります。 () インスタンス (2) - メインの図にひとまとめにすると、元の図は 1.0 までのデータ範囲で切り取られているように見えます (x 軸は 2.0 まで上昇します) (3) - 次に、軸の位置が完全にねじ込まれています。 ..

私は何を間違っていますか?

よろしくお願いします。

M

4

1 に答える 1

2

これを行う最も自然な方法は、最初にカスタム軸を作成してから直接プロットすることだと思います。その音によると、独立したスクリプトを変更して、(ステートフルなインターフェイスを使用するのではなく) 引数として軸インスタンスを取り、それに対してプロットを行う必要があります。

これを行う 1 つの方法は、から軸インスタンスのリストを返すことですcustomfigure

for i in xrange(len(axlist)):
    axlist[i] = fig.add_axes(ax[i])
return axlist

これらを使用して、スクリプトのメイン セクションでプロットできます。

color = ['k', 'r','g', 'b']
alist = customfigure() # (customfigure doesn't need to take any
                       # arguments now)
for i in xrange(4):
    s = np.sin(2*(i+1) * np.pi * t)
    alist[i].plot(t, s, '-', color = color[i])

そしてそれはあなたが望むことをするはずです。この種のことは、カスタム プロットを行うときに私がよく行うことです。

独立したスクリプトを本当に変更したくない場合plt.scaは、ステート マシンの現在の軸を作成してプロットしたい軸に設定することで、ステートフル インターフェイスでほぼ同じことを実現できます。 . これには、次のようなことを行う必要があります。

color = ['k', 'r','g', 'b']
alist = customfigure() # (customfigure doesn't need to take any
                       # arguments now)
for i in xrange(4):
    s = np.sin(2*(i+1) * np.pi * t)
    plt.sca(alist[i])
    plt.plot(t, s, '-', color = color[i])

これが役に立ち、理解できることを願っています!

于 2014-09-04T08:18:27.417 に答える