Spyder: デバッグ中にMatplotlibで作成されたプロットを表示できません

作成日 2015年02月17日  ·  47コメント  ·  ソース: spyder-ide/spyder

_2011-04-12T17:33:50Z_のal.dan ... @ gmail.comから

このスクリプトをスパイダー内で実行すると、正常に機能し、等高線図が作成されます。

#!/ usr / bin / env python
matplotlib.pyplotからimportimshow、show
numpyをnpとしてインポート
x = np.random.rand(4,5)
imshow(x)
公演()

ただし、デバッグモードに入り、imshow(x)行にブレークポイントを設定してから、(Pdb)プロンプトでimshow(x)およびshow()コマンドを手動で入力すると、プロットが表示されません。 プロットオブジェクトへの参照のみを取得します。

(Pdb)imshow(x)

(Pdb)show()
(Pdb)

デバッグモードで変数をプロットできるようにするための優れた拡張機能になります。

Python 2.7.1
NumPy 1.5.1
matplotlib 1.0.1(WXAggバックエンド)
RHEL 4.8 x86_64

_元の問題: http ://code.google.com/p/spyderlib/issues/detail?id = 620_

11–20 stars Debugger Bug

最も参考になるコメント

厄介な詳細については、 https://github.com/matplotlib/matplotlib/pull/4779を参照して

非常に短いバージョンで、GUIが応答するためには、イベントループ(基本的にユーザーI / Oを待機する無限ループ)が実行されている必要があります。 デバッグプロンプトも無限ループにあり、ユーザーが入力するのを待っています。 「通常の」プロンプトでは、これら2つのループを共有するために行われる微妙な統合作業があります(基本的に、プロンプトは、単一のキーが押されるまでGUIループを実行し、キーを処理してから、GUIイベントループを再開します)。 デバッグプロンプトでは、この統合は行われず、図は「死んでいる」ように見えます。 これは、GUIベースのウィンドウに影響します。

plt.pause()呼び出しが機能する理由は、指定された秒数の間GUIイベントループを明示的に実行するためです。

インラインバックエンドは、静的pngを生成するだけなので機能します(_always_'dead 'も同様です)。

全てのコメント47件

_2011-04-12T15:40:57Z_のal.dan ... @ gmail.comから

これがspyder2.0.8とipython0.10.1であるということを追加するのを忘れました。
また、スパイダーが実行されるときのバックエンドはQt4Aggです。 ターミナルウィンドウから直接(つまり、spyderから独立して)ipythonを実行すると、WXAggが発生します。

_From ccordoba12 2011-05-15T19上:31:44Z_

ラベル: Cat-Debugger

_From ccordoba12 2011-08-16T11上:41:02Z_

課題#733はこの課題に統合されました。

_2011-11-10T07:23:21Z_のeigenjoh ... @ gmail.comから

この修正により、このアプリケーションはMATLABキラーになります

_2013-05-12T21:43:03Z_のkavaldj ... @ gmail.comから

これは修正されたか、何らかの方法で対処されましたか?

コメント#4に同意します:これにより、SpyderがMLキラーに近づきます

_From contrebasse 2013-05-13T00上:37:52Z_

1:これは正常です。matplotlibのデフォルトのバックエンドはWXAggです。 スクリプトで変更できます:

matplotlibをインポートする
matplotlib.use( 'Qt4Agg'、warn = False)

_2013-05-13T07:45:45Z_のjed.lud ... @ gmail.comから

もう少しテストを行った後の追加の最近の診断:

  • スクリプトが現在のインタラクティブPythonセッションまたはインタラクティブIPythonセッション内で実行されると、Spyder内でのデバッグ中にプロットが失敗します。 これは、Qt4AggまたはWXAggバックエンドに当てはまります。
  • スクリプトが専用のPythonインタープリターで実行されるように設定されている場合、デバッグ中のプロットはSpyder内で正常に機能します。 これもバックエンドから独立しています。
  • デバッグ中のプロットは、システムコンソールで実行すると、「ipythonqtconsole」のセッションから正常に機能します。

Soyder 2.3.0dev(リビジョン0bb65fdb4b6e)
Python 2.7.332ビット
IPython 0.13.2
Matplotlib 1.2.0
Windows 7(64ビット)

_2013-05-14T13:45:31Z_のkavaldj ... @ gmail.comから

8ジェド、ありがとう!

専用のインタプリタでデバッグを実行すると、すばらしいヒントが得られます。

貪欲に見える場合はお詫びしますが、フィギュアを非モーダルにする簡単な方法はありますか?

現在、Pdbで停止しているため、インタープリターをブロックします。使用できる別のトリックがあるでしょうか。 私はimshow(data)、show()を呼び出しています。

よろしくお願いします!
ダン

_2013-05-14T16:55:16Z_のjed.lud ... @ gmail.comから

@ -kavaldijiev:フィギュアを非モーダルにするのは、解決するのが難しい部分です。 カルロスは問題#733でこれを解決することを検討したようですが、興味深いスレッド作業がなければ簡単ではないかもしれません。 これはおそらく、matplotlibのインタラクティブモードをpdbと並行して実行する必要があることと関係があり、これらのスレッドを連携させる方法を理解する必要があります。

IPython Qtコンソールでデバッグ中にプロットしようとすると、「show()」コマンドを発行した後もブロックされることに注意してください。 そこでも完全にインタラクティブではありません。

専用のインタプリタで実行することは、今のところ最善の回避策のように見えます。

_2013-05-15T14:54:57Z_のkavaldj ... @ gmail.comから

@ -jed詳しい説明ありがとうございます!

モーダルフィギュアで管理します。 しかし、長期的に機能させることは間違いなく価値があり、MATLABの群衆にとって非常に魅力的である可能性があります。

_2013-05-16T07:57:29Z_のjed.lud ... @ gmail.comから

@ -kavaldijiev:もう少し調査した後、デバッグ中にインタラクティブにプロットする方法を提供する別の回避策があります。 インタラクティブなプロットの邪魔になっているのは、おそらくQtGUIコンポーネントのようです。 QtコンソールインターフェイスなしでIPythonを実行すると、ブロッキングなしのデバッグ中にインタラクティブなプロットが機能します。 コマンドは次のとおりです。

  1. コマンドプロンプトを開き、スクリプトがあるディレクトリにcdします。
  2. プロンプトで「ipython--pylab」を実行します。
  3. IPython内で、 "%run-dを実行します.py」
  4. これで、pdbコマンドを使用してコードをステップ実行し、imshow()を使用してプロットできるようになり、コマンドライン入力をブロックせずにプロットが描画されるはずです。

_2013-05-16T15:11:32Z_のjed.lud ... @ gmail.comから

そして、もう少し調査した後、私はこの答えを見つけました: http

matplotlib.pyplotからインポートimshow、一時停止
numpyをnpとしてインポート
x = np.random.rand(4,5)
imshow(x)
一時停止(1)

デバッグ中に、ブロックせずにSpyderインタラクティブコンソール内でプロットをインタラクティブに更新できます。 したがって、show()の代わりにpause(1)を使用してください。 プロットは一時停止期間中のみインタラクティブになるため、データをズームまたはパンする時間を増やしたい場合は、pause(10)またはpause(20)を使用してください。 IPythonQtコンソールでも動作します。

_2013-05-16T22:35:04Z_のkavaldj ... @ gmail.comから

@ -jed、ありがとう、両方の方法が機能します!

コマンドプロンプトメソッドはより堅牢に見えます-開いている図形を閉じることができ、閉じるまで図形はフォーカスを取得できます(ズームなど)。

一時停止方法はSpyder内にあるため、明らかに望ましい方法です。 一時停止するとキーボードコントロールが返されますが、ウィンドウを閉じるべきではありません。そうしないと、インタプリタがハングします。新しい図をさらに開くと不安定になることがあります。成功する場合と失敗する場合がありますが、テストにはあまり時間をかけませんでした。

いずれにせよ、MLほど簡単で堅牢ではありませんが、これらはいずれもデバッグに非常に役立ちます。

乾杯、
ダン

_2013-05-19T21:08:30Z_のal.dan ... @ gmail.comから

数年後に進歩を見てうれしいです。 はい、pause(n)トリックは私にとってうまく機能します。 解決策をフォローしてくれてありがとう、@ -jed!

_2013-05-20T09:13:28Z_のjed.lud ... @ gmail.comから

調査以外のことはあまり信用できません。 一時停止(n)関数は、たまたま発見したmatplotlib機能です。

最終的に、この問題の根本は、実際にはmatplotlib描画イベントループとQtアプリケーションイベントループの間の相互作用であり、実際に「スパイダー」ソリューションがあるかどうかはわかりません。 おそらくmatplotlibレベルで対処する必要があります。 これを証明するものとして、Qtコンソールで実行されているIPythonには同じ制限があります。

_2014-07-07T05:33:04Z_のjason.bo ... @ gmail.comから

この問題はIEPで解決されたようです: https

_From ccordoba12 2014-07-07T07上:53:08Z_

問題#1848はこの問題に統合されました。

誰かが私たちがこれらすべてに向かっているところについて少し見通しを私に与えることができるかどうか私はちょうど思っていました。 Matlabの使用に多くの時間を費やし、さまざまな理由でPythonの世界に非常に惹かれ、真の生産性は驚くほど近いが、蜃気楼のように常に外に出ているように感じるのは私だけではないのではないかと思います。リーチの。 pause()の回避策は素晴らしく、Spyderチームの応答性は本当に印象的です。 そして、El Capitanの遅いエディターの問題が3.0ベータ版で解決されたように見えるので、すべてが_非常に近い_ように見えます。 それでも...

では、専門家はこれがすべて向かっているとどこに向かっていると思いますか? 私が収集できることから、問題の大部分はMatplotlib自体です。 そして、私はまた、guiqwtは今のところ素晴らしい形ではないことを収集します。 では、IDEでデバッグしたり、ブレークポイントに到達したり、ブレークポイントからインタラクティブなプロットを実行したりできる状況に向かっていると人々は考えているのでしょうか。 それがすべての元Matlabユーザーが望んでいることだと思います。私たちの中には、Matlab Home Editionに200ドルを払って、The Borgに戻り、Pythonのアプローチとコミュニティベースのソフトウェアの魅力から離れるべきかどうか疑問に思っている人もいます。 Python言語。

不平を言っているように聞こえるかもしれませんが、実際には時間を費やす方法を見つけようとしています。 私は本当にPythonの方法がMatlabのキラーになることを望んでいます...

@jandyman 、絶望しないでください:-)私たちはSpyder 3.0の大規模な再編成/クリーンアップを行ってきました。これは、この問題を解決する予定の

本当の問題はMatplotlibではなく、デバッグ中にコンソールをブロックするIPython / Jupyterアーキテクチャにあり、Matlabのように(履歴の参照とプロットを使用して)より機能的なデバッグセッションを実行できなくなります。

ただし、3.0がリリースされてから(1か月ほどで)、Spyderが抱える多くの未解決で非常に不快なデバッグの問題を解決するためにすべての努力が向けられることを保証します。 すべてが順調に進み、成功した場合は、年末までに(私が言ったように)4.0で修正をリリースするか、次の年の初めにリリースする予定です:-)

私はまた、guiqwtは今のところ素晴らしい形ではないことを収集します

これは@PierreRaybautプロジェクト(Spyderを作成したのと同じプロジェクト)です。 残念ながら、彼は最近オープンソースのための時間があまりありません:-(

私はまた、guiqwtは今のところ素晴らしい形ではないことを収集します

これは@PierreRaybautプロジェクト(Spyderを作成したのと同じプロジェクト)です。 残念ながら、彼は最近オープンソースのための時間があまりありません:-(

@ ccordoba12、@jandyman:それは残念ながら、そうです。
ただし、最近guiqwtでいくつかの重要な作業を行いました。PyQwtの陳腐化の問題を純粋なPythonで再実装することで解決し( PythonQwtプロジェクトを参照)、guiqwtv3がPyQwtに依存しなくなりました。 guiqwtは今のところ悪い状態ではないと思います。最近の開発のおかげで、Python 2.7、3.0-3.5、およびQt4-Qt5で動作します。 しかし、プロジェクトを管理する時間がないため(つまり、新しい機能の作成、ライブラリの宣伝など)、プロジェクトは成長していません。メンテナンスのみを行っているため、現在の機能は以前と同じように機能し続けます。 現状では、たとえば、リアルタイムで大きな画像を表示および操作する(ゾミング/パン、コントラストの調整、断面のプロットなど)ために、matplotlib(またはMATLAB)よりもはるかにパフォーマンスが高いことに注意してください。双方向性に関するmatplotlibの先を行く。

@jandymanの元の投稿に関しては、MATLABの優れた代替としてPython / Spyderを使用するための解決策がそこにあるとは思えません。 個人的には、2009年に、私はすでに妥協することなくそうすることができました。 しかし、2009年にこれを実装するソリューションは、コードの現在の状態には適用されなくなりました。当時、Spyderは「純粋な」Pythonインタープリターに依存していました。 @ ccordoba12が述べたように、Spyderは現在IPython / Jupyterに依存しています。これは多くの新機能を有効にしたので素晴らしいことですが、欠点もあります。
とにかく、MATLABよりもSpyderで同じように対話できない理由がわかりません。

皆さんこんにちは、

私はMATLABからPythonに切り替えたユーザーの1人です。 Spyderは優れたIDEだと思いますが、デバッグ中にインタラクティブなプロットが行われないという問題は、MATLABを使用する人々にとって重要な欠点です。

それを解決するのはそれほど難しいことではないと思います。 たとえば、システムターミナル(qtConsoleなし)からIPythonを実行していて、IPythonまたはipdbセッションのいずれかからインタラクティブプロット(guiqwt)を問題なく実行できます。 また、デバッグ中のコマンド履歴があります。 ターミナル(qtConsoleなし)からipythonを実行する方法を置き換える(またはオプションを追加する)だけで、この問題は解決されると思います。

多くの人がSpyderを使用するのを妨げているのはこれだけだと思う​​ので、これを修正してみてください。

ありがとう、

フェリペ

それを解決するのはそれほど難しいことではないと思います。

です。 ターミナルでIPythonが使用するライブラリとテクノロジー、およびqtconsoleは完全に異なります。

このバグは5年間開かれていますが、まだしばらくはあります;-)

この機能が必要なのは、画像処理アルゴリズムを開発するためのメインIDEとしてSpyderを使用しているためです。デバッグ中に画像を表示することは、非常に一般的な機能要求です。

私もそれが欲しいです、私は主にデバッグのためにSpyderを使います。

@mmagnuski 、これは現在、デバッグ中に%plotマジックを使用することで可能です。

%plot plt.plot(range(10))

ただし、これを機能させるには、MatplotlibバックエンドをInlineに設定する必要があります。

@tacaswell @WeatherGodと会話していたところ、彼はあなたがチャイムを鳴らすことができるかもしれないと思っていました。

難しいとは思いますが、これが「シームレス」に機能すればいいですね。

今のところ、私はpause(10)トリックを使用します。

厄介な詳細については、 https://github.com/matplotlib/matplotlib/pull/4779を参照して

非常に短いバージョンで、GUIが応答するためには、イベントループ(基本的にユーザーI / Oを待機する無限ループ)が実行されている必要があります。 デバッグプロンプトも無限ループにあり、ユーザーが入力するのを待っています。 「通常の」プロンプトでは、これら2つのループを共有するために行われる微妙な統合作業があります(基本的に、プロンプトは、単一のキーが押されるまでGUIループを実行し、キーを処理してから、GUIイベントループを再開します)。 デバッグプロンプトでは、この統合は行われず、図は「死んでいる」ように見えます。 これは、GUIベースのウィンドウに影響します。

plt.pause()呼び出しが機能する理由は、指定された秒数の間GUIイベントループを明示的に実行するためです。

インラインバックエンドは、静的pngを生成するだけなので機能します(_always_'dead 'も同様です)。

説明とリンクされた問題トーマスをありがとう!

このPRは私が思うにそれを解決するでしょう: https

すごい仕事! どうもありがとう@ impact27!

これに対する解決策はありますか? plt.pause(1)の後で図を閉じることができません。 plt.close()を試し、もう一度一時停止しましたが、成功しませんでした。 ありがとう

これに対する解決策はありますか? plt.pause(1)の後で図を閉じることができません。 plt.close()を試し、もう一度一時停止しましたが、成功しませんでした。 ありがとう

plt.close() (または'all' )の引数として数字を指定する必要があります。 今のところ解決策はplt.pauseです。 ipykernelがhttps://github.com/ipython/ipykernel/pull/438をマージするときに解決され

これに対する解決策はありますか? plt.pause(1)の後で図を閉じることができません。 plt.close()を試し、もう一度一時停止しましたが、成功しませんでした。 ありがとう

plt.close() (または'all' )の引数として数字を指定する必要があります。 今のところ解決策はplt.pauseです。 ipykernelがipython / ipykernel#438をマージするときに解決されます。 私は個人的に、このブランチをマージした修正バージョンのipykernelを使用しています。

それはうまくいきませんでした。 plt.figure(1);を実行します。 plt.imshow(myimage); plt.pause(1); plt.close(1)で、結果はありません。 私はIPython7.11.1、Spyder 4.0.1、およびpython3.7.5を使用しています

再現できました。 それについての新しい問題を開いてください。 回避策として、 plt.pause下で十字架でそれらを閉じることができます

再現できました。 それについての新しい問題を開いてください。 回避策として、 plt.pause下で十字架でそれらを閉じることができます

この回避策は機能しました。 それは変だ。 とにかくありがとう

これは、デバッグ中の問題だけではありません。 インラインバックエンドをアクティブにしました。 最小限の作業例を次に示します。

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

例で「ファイルを実行」すると、インラインプロットが表示されます。 例全体を選択して「選択または現在の行を実行」すると、インラインプロットが表示されます。 1〜6行目と「選択行または現在の行を実行」を選択し、コンソールに残りの例を入力すると、プロットが表示されません。 プロットオブジェクトへの参照は表示されます。

これは、デバッグ中の問題だけではありません。 インラインバックエンドをアクティブにしました。 最小限の作業例を次に示します。

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

例で「ファイルを実行」すると、インラインプロットが表示されます。 例全体を選択して「選択または現在の行を実行」すると、インラインプロットが表示されます。 1〜6行目と「選択行または現在の行を実行」を選択し、コンソールに残りの例を入力すると、プロットが表示されません。 プロットオブジェクトへの参照は表示されます。

これはこのバグに関連しているとは思いません。 これは、プロット自体が「再描画」されないインラインバックエンドを使用する場合の1つの制限です。 インラインバックエンドで何かを明示的にプロットする必要がある場合は、次のことができます。

from IPython.core.display import display
display(fig)

display(fig)機能します。 それでも、ファイルを完全に実行することと、ファイルを部分的に実行してからコンソールで終了することの間の一貫性のない動作は混乱を招きます。

@ kdpenner-コードをセル間で分割すると、たとえばノートブックでも同じ動作が得られます。これは予想されることです。 しかし、これにはdisplay()関数を使用する必要はないと思います。 コンソールでfigと入力すると、図が表示されます。

fig機能します。 この動作の違いは設計されたものかもしれませんが、ユーザーとして私が期待していることではありません。

@kdpennerつまり、インラインバックエンドを使用する他の環境でも同じ動作が得られるため、これはSpyderの問題ではありません。

@mmagnuskiわかりましたfig回避策をありがとう。

🎉

これを修正してくれてありがとう!

エキサイティング!

これと、バージョン4.2.0でリリースされたデバッガーのその他の改善点についてはこちらをご覧ください

このページは役に立ちましたか?
0 / 5 - 0 評価