11

以前、複数の Matplotlib フィギュア間の干渉に問題がありました。最後に、いくつかのpyplot関数がフィギュアインスタンスにアタッチされていないが、並行して作成された他のフィギュアインスタンスでレンダリングできるという問題を追跡しました。

コード例を次に示します。

from django.http import HttpResponse
from numpy import arange, meshgrid
from matplotlib.mlab import bivariate_normal

def show_chart(request):
    delta = 0.025
    x = arange(-3.0, 3.0, delta)
    y = arange(-2.0, 2.0, delta)
    X, Y = meshgrid(x, y)
    Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    Z = 10.0 * (Z2 - Z1)

    from matplotlib.pyplot import figure, contour
    fig1 = figure(figsize=(4, 4), facecolor='white')
    contour(X, Y, Z)

    response = HttpResponse(content_type='image/png')
    fig1.savefig(response, format='png')
    fig1.clear()
    return response

上記の例の等高線 pyplot 関数は、fig1 でレンダリングできますが、並行して生成される他の Figure でレンダリングされることもあります。それはとても迷惑です。輪郭 pyplot 関数を fig1 にアタッチする方法はありますか?

4

2 に答える 2

21

ここで何が起こっているかを少し説明すると、 にmatplotlibは 2 つの半独立したインターフェイスがあります。ステート マシンと OO インターフェイス。

ステート マシン コードは、対話型シェルで動作するように設計されています (また、matlab のインターフェイスを模倣しています)。figureこれは、OO インターフェースを一連のコマンドにラップして、現在のとが何であるかを追跡することによって行われますaxes。from コマンドを使用する場合matplotlib.pyplot(コードに があると思わfrom matploblib.pyplot import *れます) in は、実行するのとほぼ同等gcf().gca().contour(...)です。新しい Figure を作成すると、自動的に現在の Figure になります (反復シェルでこれを使用している場合はこれが必要です) ので、表示される動作は「正しい」動作です。ステート マシン インターフェイスには、必要に応じて Figure を再描画したり、GUI イベント ループを管理したりするためのコードも含まれています (対話型インターフェイスをスムーズに動作させるために必要なすべてのこと)。ヘイデンがコメントで述べたように、実行中ipython --pylabが自動的に実行さfrom matplotlib.pyplot import *れ、非常に優れたインタラクティブなシェルが提供されます。

OO インターフェースは、 をプログラムで処理するために設計されていますmatplotlib。これにより冗長性が増し (ステート マシンの作業のほとんどを実行する必要があります)、明快さが補われます。OO モデルでは、プロット関数のほとんど (おそらくすべて) がAxesオブジェクト ( doc ) に関連付けられています (1 つの図に複数の軸が関連付けられている可能性があるため (例:を使用したサブプロットgridspec))。

あなたの問題を解決する別の方法は

ax = fig1.gca()

から現在の軸を取得し、fig1必要に応じて作成します。これは、Axes オブジェクトではなく Figure オブジェクトを追跡し、別のグラフを Figure に追加したい場合に役立ちます。

于 2013-01-10T15:46:17.350 に答える
12

contourサブプロットを作成してから、サブプロットのメソッドを呼び出すことができます:

fig1 = figure(figsize=(4, 4), facecolor='white')
ax = fig1.add_subplot(111)
ax.contour(X, Y, Z)

plt.subplots1 回の呼び出しで Figure とサブプロットを簡単に作成できます。

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
于 2013-01-10T09:43:30.787 に答える