web-dev-qa-db-ja.com

Matplotlibの「インタラクティブモード」(ion()、ioff())の正確なセマンティクス?

Matplotlibのpyplotの「インタラクティブモード」のドキュメントには次のように書かれています。

Pyplotインターフェイスのインタラクティブプロパティは、すべてのpyplotコマンドでフィギュアキャンバスを描画するかどうかを制御します。インタラクティブがFalseの場合、Figureの状態はすべてのプロットコマンドで更新されますが、draw()の明示的な呼び出しでのみ描画されます。インタラクティブがTrueの場合、すべてのpyplotコマンドが描画をトリガーします。

これは十分に明らかなようです。インタラクティブモードがオンの場合、plot()を実行しなくてもdraw()を実行できます。ただし、次のコードでdraw()を実行しても、何も実行されません。

_from matplotlib import pyplot as pp

# Interactive mode is off by default

pp.plot([10, 20, 50])
pp.draw()

raw_input('Press enter...')  # No graph displayed?!!
_

(Windows XPでは、Matplotlib 1.0.1)。

最初にion()を追加すると、ユーザーがEnterキーを入力するのを待っている間、図が表示されます(これにより、すべての図が閉じられます)。

_from matplotlib import pyplot as pp

ion()

pp.plot([10, 20, 50])  # No draw() is necessary

raw_input('Press enter...')  # The graph is interactive *and* the terminal responds to enter
_

したがって、ion()は、各プロットコマンドの後にグラフの自動更新を追加するだけではなく、moreのように見えますが、残念ながら、ドキュメントには何も見つかりません。後者のプログラムのもう1つのより重要な問題は、ion()によってすべてのプロットコマンドがグラフを更新することです。これは、1つのグラフが複数回更新される場合に時間がかかります。

だから、次の方法があります:

  • ターミナルに入るのを待たせ、その後すべての数字が自動的に閉じられます。
  • インタラクティブなMatplotlibグラフを持ち、
  • …最初にインタラクティブモードを強制的にオンにせずに(グラフの自動更新を強制しないようにするため、時間がかかる可能性があります)?
21
Eric O Lebigot

これは、Matplotlibメーリングリストのこの主題に関する 興味深い議論 の要約です。エグゼクティブサマリーは次のとおりです。

  • インタラクティブモード(ion()でアクティブ化)は多くのことを自動化します。特に、_pyplot.*_コマンドは、関連する軸を画面上で自動的に更新します。ただし、ax.plot()axはAxesオブジェクト)などのMatplotlibオブジェクトに対するメソッド呼び出しは、通常、自動更新を実行しません。この場合、pyplot.draw()は必要な更新を実行します。)

  • 非対話型モードはあまり便利ではありません。 draw()は通常not画面上の図を更新します。 draw()が非対話型モードでいくらか「非アクティブ」であるという事実は、現在のドキュメントには記載されていませんが、近いうちに含まれることを願っています。

それまでの間、インタラクティブモードと非インタラクティブモードの詳細については、Matplotlibの 現在のブランチ をご覧ください。 draw()show()およびその友人のためのより良い documentation も同じブランチにあります。

16
Eric O Lebigot

「トーマスK」の最後のコメントに従うことをお勧めします。メーリングリストで同様の質問を覚えていますが、数分間検索しても見つかりませんでした。ごめんなさい。

私もこの問題を抱えていました。私にとってより簡単な方法は、_ipython --pylab_を使用することでした。 ion()に問題があるはるかに古いバージョンのmatplotlibがインストールされています。これに加えて、matplotlibにはWindowsのdraw()に関するいくつかの問題もありました。多分それは最後のバージョンで修正されました。

p.s .:申し訳ありませんがあなたを本当にうまく助けることができませんでした。

宜しくお願いします。

4
ahelm