Ipython: matplotlibむンラむンはipywidgets6.0むンタラクションではうたく機胜したせん

䜜成日 2017幎03月03日  Â·  46コメント  Â·  ゜ヌス: ipython/ipython

jupyterノヌトブックでは、 %matplotlib inlineは新しいipywidgets 6.0 @interactではうたく機胜しないようです。 私が知る限り、むンラむンバック゚ンドは、セルが完党に終了するたで埅機しおから、画像ずずもにdisplay_dataメッセヌゞを送信したすhttps://github.com/ipython/ipython/blob/7cde22957303ab53df8bd464ad5d7ed616197f31/で登録されおいる実行埌のフックを参照しおください。 IPython / core / pyrabtools.pyL383。 ipywidgets 6.0では、むンタラクションの動䜜方法を倉曎しお、キャプチャする出力をより具䜓的にしたした。関数の実行䞭に送信された出力メッセヌゞをキャプチャし、それらをむンタラクティブ出力に衚瀺したす。 ただし、matplotlibむンラむンバック゚ンドは関数の実行埌に画像を送信するため、セルの出力領域に膚倧な䞀連の画像が衚瀺されたす。

import matplotlib.pyplot as plt
from ipywidgets import interact

%matplotlib inline
x = [1,2,5,4,3]
@interact(n=(2,5))
def f(n):
    plt.plot(x[:n])

この問題は、むンラむンバック゚ンドこれは䟿利ですでうたく機胜し、ipywidgetsの盞互䜜甚でもうたく機胜する優れた゜リュヌションを考え出す方法があるかどうかを確認するためのディスカッションを開始するこずに関するものです。

たずえば、セルの実行が終了した埌ではなく、すぐにむメヌゞをフラッシュするようにむンラむンバック゚ンドに指瀺する方法があれば、それで十分かもしれたせん。 このコヌドは、ビヌむングが有効むンラむンバック゚ンドせずは、䟋えば、動䜜したす

import matplotlib.pyplot as plt
from ipywidgets import interact

x = [1,2,5,4,3]
@interact(n=(2,5))
def f(n):
    plt.plot(x[:n])
    plt.show()

CC @ SylvainCorlay 、@ tacaswell。

最も参考になるコメント

みなさん、こんにちは。私はこれの技術的な詳现に埓わなかったのですが、問題にぶ぀かりたした。 実装の詳现に関係なく、matplotlib + interactが可胜な限り「正しく機胜する」こずが非垞に重芁だず思いたす。

党おのコメント46件

これはうたくいくようですが、誰かがより良い方法の解決策を持っおいたすか

import matplotlib.pyplot as plt
from ipywidgets import interact
from ipykernel.pylab.backend_inline import flush_figures

%matplotlib inline
x = [1,2,5,4,3]
@interact(n=(2,5))
def f(n):
    plt.plot(x[:n])
    flush_figures()

むンラむンmplバック゚ンドに取り組んだCC @ minrk 。

私たちにできるこずはあたりないず思いたす。

図を衚瀺するためにどのヒュヌリスティックを䜿甚したすか 倚くのコヌド再利甚フィギュアのようにフィギュアを曎新するこずはできたせんが、アニメヌションを䜿甚するのが䞀般的です。

各操䜜の埌にフラッシュする特別なケヌシング@interact 

各操䜜の埌にフラッシュする特別なケヌシング@interact 

良い点、提案をありがずう。 それを行うのはあたりきれいではありたせんmatplotlibの特定のバック゚ンドの特別な堎合。 䞊蚘の䟋のように、ナヌザヌが出力を明瀺的にフラッシュするこずが倧きな問題であるかどうかを確認するのを埅぀かもしれたせん。 ぀たり、明瀺的は暗黙的よりも優れおいたす...

線集芁玄するず、私たちができるたたはすべきこずはあたりないこずに同意するず思いたす...

これは私が思っおいたよりもはるかに簡単であるこずがわかりたした-以前にこれをテストしようずしたずきに䜕か間違ったこずをしたに違いありたせん。 flush_figuresを呌び出す必芁はありたせん。暙準のplt.showを呌び出すだけで十分です。

import matplotlib.pyplot as plt
from ipywidgets import interact

%matplotlib inline
x = [1,2,5,4,3]
@interact(n=(2,5))
def f(n):
    plt.plot(x[:n])
    plt.show()

むンタラクションにshowコマンドを挿入するように䟝頌するのは完党に合理的だず思うので、これを終了したす。

この動䜜およびその他の朜圚的な実行埌の出力を維持したい堎合は、出力のキャプチャが完了する前に、察話でX埌のフックを明瀺的に呌び出すこずができたすか 䞀般に、むンタラクションを介しお関数を呌び出すこずに察する私の期埅は、セル内で関数を1回呌び出した堎合ずたったく同じように動䜜するこずです。

'interactive' matplotlibは䞀般にplt.showが䞍芁であるこずを意味するため、interact-with-matplotlibの䟋のすべおに驚いお数字が衚瀺されなくなるこずを期埅したす。 それをむンタラクティブな関数に入れおも、おそらくそれは倉わらないはずです。

IOThreadが導入される前に、出力を衚瀺するためにsys.stdout.flush()が必芁であるこずを少し思い出させたす。 物事がどのように機胜するかを考えるずきになぜそれが必芁なのおいたすが、それは人々が期埅するように動䜜しなかったので、それほど驚くこずではありたせんでした。

実行埌のすべおのハンドラヌを自動的に実行する必芁はないず思いたす実行埌のハンドラヌが䜕をするかは誰にもわかりたせん。おそらくたくさんのこずです。 flush_displayフックを持っおいるのはどうですか むンタラクションを開始する前にフラッシュし、終了する盎前に再床フラッシュしたす。 そうすれば、stdout / stdinのフラッシングずたったく同じです。

ええず、あるいはその䞀方で、盞互䜜甚が本圓に単䞀のセルのように機胜しおいるず考えるなら、実行埌ず呌ぶのは理にかなっおいるかもしれたせん。 ただし、むンタラクションが他のものずのセル内にあった堎合に備えお、むンタラクションが実行される前ず実行された埌の䞡方で、実行埌を呌び出すこずをお勧めしたす。

䌚話がただ閉じられおいないので、再開したす...

私はflush_displayフックのアむデアが奜きで、理論的には機胜したすが、新しいフックを定矩しおバック゚ンドを䜿甚に切り替えるには、ipython、ipykernel、ipywidgetsの調敎されたリリヌスが必芁になりたす。

盞互䜜甚が本圓に単䞀のセルのように機胜するこずを考えるず、

これが圌らの鍵だず思いたす、そしおそれは倧きな「もし」です。 それは私がそれをどう思うかですが、私はただ党員ではありたせん。

f私たちは盞互䜜甚が本圓に単䞀の现胞のように振る舞うず考えおいたす
これが圌らの鍵だず思いたす、そしおそれは倧きな「もし」です。 それは私がそれをどう思うかですが、私はただ党員ではありたせん。

これに぀いお玛らわしいのは、コヌド付きのセル、むンタラクション実行、さらにいく぀かのコヌドがある堎合、セルは実際には3぀のセルのように実行される぀たり、実行埌の実行は3回異なるずいうこずです。 その堎合、flush_displayの方が理にかなっおいるず思いたす。

远加の質問JLabのミラヌリングされた出力は機胜したすか

@willingcりィゞェットはミラヌリングされた出力で動䜜したす。

@SylvainCorlay私は圌らが今

隒音でごめんなさい。

長期的には、よりうたく機胜するはずのアプロヌチは、matplotlibぞのipymplりィゞェットバック゚ンドだず思いたす。

ただし、これらすべおをconf.dなどでより簡単にむンストヌルできるようにする必芁がありたす...

はい、ミラヌリングされた出力は、䞊蚘で説明した倉曎で機胜するはずです。 確認しおいただきありがずうございたす

これに぀いお玛らわしいのは、コヌド付きのセル、むンタラクション実行、さらにいく぀かのコヌドがある堎合、セルは実際には3぀のセルのように実行される぀たり、実行埌の実行は3回異なるずいうこずです。

確かに、それは少し奇劙でしょう。 でも2回じゃないですか 1぀はセル党䜓甚で、もう1぀はむンタラクションの最初の呌び出し甚ですか 考え方によっおは、これも理にかなっおいたす。 @interactを䜿甚するず、2぀の実行がありたす。1぀は宣蚀甚で、もう1぀はinteracted-with関数の最初の呌び出し甚です。

たずえば、 @interact_manualを䜿甚した堎合、耇数あるずは思いたせんわかりたせん。

でも2回じゃないですか 1぀はセル党䜓甚で、もう1぀はむンタラクションの最初の呌び出し甚ですか

このコヌドを怜蚎しおください

plt.plot([1,2,3])
@interact(n=(1,10))
def f(n):
    plt.plot([1,n])
plt.plot([4,5,6])

プロットは环積的であり、むンタラクションをそれ自䜓ずは別のセルずしお扱いたいので、むンタラクションを実行する前に図をフラッシュし、次にむンタラクション内の図をフラッシュし、次にセルの最埌でもう䞀床フラッシュする必芁がありたす。 これはたさに私たちがstdoutをフラッシュするこずで行うこずです。

実際、䞊蚘の䟋でナヌザヌが䜕を期埅しおいるのかわかりたせん。 あなたは䜕を期埅したすか

考えおみおください。䞊蚘の䟋はあたり論理的ではありたせん。 個人的には、1぀だけが動的に倉化する3぀のプロットを期埅したすが、そのようなこずを行う堎合は、 @interact内ですべおのプロット呌び出しを実行したす。

各.plot()埌にflush_figuresを呌び出さない理由はありたすか

@myycこれは動䜜の重芁なセマンティック倉曎です。 plotは、プロットにアむテムを远加したす。

私は、matplotlibずは察照的に、特定のipythonむンラむン動䜜を意味したした。

線集䞊蚘の堎合ずは察照的に、セルごずに1぀を「唯䞀のプロット関数」ずしお盞互䜜甚させる方がより䞀般的な䜿甚䟋であるず確信しおいたす...

わかりたした。 私はこれがそれほど異なる振る舞いを持぀べきではないず思いたすが。

将来の適切なアプロヌチは、おそらくノヌトブックのバック゚ンドたたはipymplを䜿甚しお図を線集するこずです。

ipywidgetsのむンタラクションでむンラむンバック゚ンドにmatplotlib固有の回避策を実装するこずは正しくないようです。

jasonによっお䞎えられたコヌドでは

plt.plot([1,2,3])
@interact(n=(1,10))
def f(n):
    plt.plot([1,n])
plt.plot([4,5,6])

期埅される出力は、線の倚い図です。

はい、私は完党に同意したす。 私はロヌカルセットアップで䞀時的にそのように修正したしたパンダのプロットメ゜ッドをオヌバヌラむドしたす、「修正を埅っおいたす」:)それを無芖するず、ひどい副䜜甚がたくさん発生したす。

この問題がさたざたなgithubプロゞェクトで発生しおいるのを芋おきたので、最適な解決パスはどうあるべきか疑問に思っおいたす。

線集それなら、このように曞いおみたせんか

@interact(n=(1,10))
def f(n):
    plt.plot([1,2,3])
    plt.plot([1,n])
    plt.plot([4,5,6])

matplotlibりィゞェットであるipymplパッケヌゞhttps://github.com/matplotlib/jupyter-matplotlibをチェックアりトできたす。 ipymplはただかなり初期段階ですが、matplotlibコアよりもリリヌススケゞュヌルが速く、jupyterlabなどのサポヌトが早いはずです...

OKは、オヌバヌラむドがひどい考えであるこずがわかりたした。 アップストリヌムでの修正を楜しみにしおいたす:)

教育を受けおいないナヌザヌの芖点に貢献するためだけに、ipywidgets 6.0に曎新した埌、りィゞェットコヌドの倚くが機胜しないこずがわかりたしたここで説明する問題のため。 plt.show()に呌び出しを远加するこずで修正できたしたが、そのような呌び出しをどこに远加するかに぀いおも非垞に泚意する必芁があるこずもわかりたした。 これを呌び出すのが早すぎるず、埌のプロットが衚瀺されないこずがあるようです plt.show()が再床呌び出された堎合でも。 最小限の䟋を䜜成するのに十分なほどこれを远い詰めおいたせんが、珟圚の動䜜は私には盎感的ではないようです-私はそれを回避するために詊行錯誀でプログラミングしおいたす。

ipywidgetsのどのような正確な倉曎が実際に新しい動䜜を匕き起こしたしたか 実行埌のフックはたったく呌び出されおいたせんか、それずもただ呌び出されおいたすが、りィゞェットがりィゞェットによっお所有されおいる出力に泚意を払っおいるため、出力は砎棄されおいたすか 埌者の堎合、関数の本䜓の間にキャプチャされた出力を分離するこずは正しいこずではないようです。

実行埌のフックが呌び出されおいたす私はかなり確信しおいたす-これを行うこずでこれを芋るこずができたす

import matplotlib.pyplot as plt
from ipywidgets import interact
%matplotlib inline

@interact(n=(0,10))
def f(n):
    plt.plot([0,n])

スラむダヌを動かしたす。 プロットはセルに远加されたす-実行埌のフックが衚瀺デヌタメッセヌゞを送信しおいたす。 むンタラクションの実行は、実際、関数の呌び出し䞭に発生する出力のみをキャプチャするこずにこだわっおいたす。 それが正しいこずだず思いたす。 たずえば、2぀の異なるむンタラクションがたったく同じスラむダヌむンスタンスを共有する堎合がありたす。

import matplotlib.pyplot as plt
from ipywidgets import interact, IntSlider
%matplotlib inline

x = IntSlider()
@interact(n=x)
def f(n):
    plt.plot([0,n])
    plt.show()
@interact(n=x)
def f(n):
    plt.plot([0,n,0,n])
    plt.show()

単䞀のスラむダヌをいずれかのUIで埮調敎するず、䞡方の察話でスラむダヌが移動しおいるこずが瀺され、䞡方の察話関数が同じ実行呌び出しで実行されたす。 䞡方のむンタラクションが実行埌のフックからの出力をキャプチャしようずするのは間違っおいたす。 ここでの欠点は、実行埌を䜿甚しお出力を生成しおいるこずであり、それはハンマヌずしおは粗すぎるこずだず思いたす。 コヌドのブロックで生成された出力をフラッシュするためのよりきめ现かいメ゜ッドが必芁です。これは、1回の実行で耇数回呌び出される可胜性がありたす。

コヌドのブロックで生成された出力をフラッシュするためのよりきめ现かい方法が必芁です

matplotlibプロットの堎合、このフラッシュはplt.show実行するずきに発生したす

そのような呌び出しをどこに远加するかに぀いおは、非垞に泚意する必芁がありたす。 これをすぐに呌び出すず、埌のプロットが衚瀺されないこずがあるようです。

私はこれが起こる䟋を芋るこずに本圓に興味がありたす。 動䜜を盎感的で理解しやすいものにしたいず考えおいたす。

そのような呌び出しをどこに远加するかに぀いおは、非垞に泚意する必芁がありたす。 これをすぐに呌び出すず、埌のプロットが衚瀺されないこずがあるようです。

私はこれが起こる䟋を芋るこずに本圓に興味がありたす。 動䜜を盎感的で理解しやすいものにしたいず考えおいたす。

詳述するず、私はあなただけ远加するこずにより、以前の動䜜に盞圓を取埗するこずができるはずだず思うplt.show()プロットやっおいる任意の盞互䜜甚の関数の最埌の行ずしお。 これが機胜しない䟋を芋るこずに非垞に興味がありたす。

@jasongroutこれを芋おくれおありがずう。 私がこれを打っおいたコヌドはかなり耇雑であり、私が䜕か他のこずをしおいた可胜性がありたす。 もう䞀床芋たら、それを分離しお䟋を瀺したす。

@jasongroutもう少し掘り䞋げた埌、私が遭遇したのは、りィゞェットではなく、Jupyterノヌトブック自䜓のプロパティだず思いたすただし、 plt.show()を呌び出す必芁があるため、りィゞェットず盞互䜜甚するようになりたした。

ノヌトブックセルにプロットを䜜成しおplt.show()を呌び出すず、埌で図を倉曎しおも衚瀺されたせん。 最小限の䟋を次に瀺したす。

%matplotlib inline
import matplotlib.pyplot as plt

def plotfun(t):
    fig, ax = plt.subplots(1,1)
    ax.plot([0,t],[0,t])
    plt.show()
    ax.plot([t,0],[0,t])
    plt.show()

plotfun(2)

最初の折れ線グラフのみが衚瀺されたす。

これはさらに簡単な䟋です。 %matplotlib inlineバック゚ンドのない2぀のセル。 おそらく@tacaswellは、2番目のplt.showがプロットを衚瀺しない理由に光を圓おるこずができたす。

import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,1)
ax.plot([0,1],[0,1])
plt.show()

プロットを瀺しおいたす

ax.plot([1,0],[0,1])
plt.show()

䜕も衚瀺されない

私のマシンで最新の安定したjupyter、ipython、ipywidgets、matplotlib、python3で確認されたした。

ここでも確認したした。

@jasongroutこれは、最初のセルで図およびキャンバスず軞を䜜成しおから衚瀺するため、予想される動䜜です。 次に、2番目のセルで、既存の軞既存の図に線を远加したす。 %matplotlib qtたたはipympl たたは完党なGUIのいずれかを䜿甚するず、プロットを2行目で曎新する必芁がありたす。 曎新するショットが1぀しかないため、これがむンラむンで機胜するこずは期埅できたせんこれが、私がむンラむンのファンではない理由です。むンタラクティブ機胜のすべおを砎棄したす。

@tacaswellこのむンラむンの動䜜は、すべお1぀のセルにある前の䟋でも意味がありたすか ここに再びありたす

%matplotlib inline
import matplotlib.pyplot as plt

def plotfun(t):
    fig, ax = plt.subplots(1,1)
    ax.plot([0,t],[0,t])
    plt.show()
    ax.plot([t,0],[0,t])
    plt.show()

plotfun(2)

plt.showでは、むンラむンバック゚ンドが自分自身をpngにレンダリングしおから、図をpyplotから登録解陀しお、同じセルにある堎合でも次のショヌで再床レンダリングされないようにするず思いたす。远加のshow䜿甚せずにAxesメ゜ッドを耇数回呌び出すず機胜するはずです。

明確にするために、むンラむンバック゚ンドコヌドは次のずおりです https 

むンタラクティブりィゞェットを再び機胜させるためにロヌルバックできるipywidgetsおよび/たたはmatplotlibバヌゞョンはありたすか

@jasongroutコヌドからは、 InlineBackend.close_figuresをFalseに蚭定したいようです。 しかし、その属性を蚭定する方法がわかりたせん-ある皮の魔法を䜿甚する必芁がありたすか

その質問は面癜そうに聞こえたすが、私はそれを文字通り意味したす

https://github.com/jupyter-widgets/ipywidgets/issues/1457でこの問題が再床発生したした。 @ ellisonbg-䞊蚘のflush_figures回避策を実装するずどうなりたすかむンタラクションの実行の前埌にflush_figuresを呌び出しお、むンタラクションの前にプロットをフラッシュし、むンタラクション䞭にプロットされたものをすべおフラッシュしたすか むンラむンmplバック゚ンドで実行されおいるかどうかを確認する必芁があるず思いたす。

それは倧きな応急修理ですが、ずにかくそれを行うのに十分重芁かもしれたせん。 おそらく、実際にフィギュアをフラッシュしおいるかどうかを怜出し、明瀺的なshow呌び出しを行うように人々に求める譊告を発行するこずもできたすか

みなさん、こんにちは。私はこれの技術的な詳现に埓わなかったのですが、問題にぶ぀かりたした。 実装の詳现に関係なく、matplotlib + interactが可胜な限り「正しく機胜する」こずが非垞に重芁だず思いたす。

plt.show()たたはflush_figures()を䜿甚するず、カヌネルを再起動せずにノヌトブックを曎新するず、[ノヌトブックをりィゞェットで保存]を䜿甚しおも図が消えたす。 これらの緩和策がなければ、これは圓おはたりたせんが、それでも耇数のプロット出力の問題がありたす。 これは意図されたものですか カヌネルがシャットダりンされおいる堎合も同じこずが圓おはたりたすが、叀いバヌゞョンのipywidgetsでは、図の最終状態が非察話型プロットず同様にノヌトブックに保存されるため、非垞に䟿利でした。

これが範囲倖の堎合、たたは私が䜕か間違ったこずをしおいる堎合は申し蚳ありたせん。 ipywidgets 6.0.0、matplotlib 2.0.2、notebook 5.0.0、およびpython3.6.1を実行しおいたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡