web-dev-qa-db-ja.com

Jupyter Notebookで%matplotlibインラインの後に%matplotlibノートブックを使用しても機能しない

円グラフの図をプロットするためにJupyter Notebookを使用しています。

最初のセルでは、コードでマジックコマンド%matplotlib inlineを使用し、このマジックコマンドの後、コードを実行すると、すべてが正常に機能し、フィギュアがレンダリングされます。

しかし、2番目のセルでインタラクティブプロット用に%matplotlib notebookを設定すると、この2番目のセルを実行した後、フィギュアはレンダリングされません。

カーネルを再起動し、%matplotlib notebookでセルを再度実行する必要があり、その前に%matplotlib inlineコマンドを実行できません。

最初のセル with %matplotlib inlineの私のコードは、上手くレンダリングされます:

import matplotlib.pyplot as plt

%matplotlib inline

labels = "No", "Yes"
sizes = [100, 50]

fig, ax = plt.subplots(figsize=(6, 6))

_, texts, autotexts = ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
             shadow=False, startangle=90)

ax.axis('equal')

その後、同じコードで2番目のセルがあり、%matplotlib inlineのみが%matplotlib notebookに変更されます。このセルを実行した後、図はレンダリングされず、カーネルを再起動してこのセルを再度実行する必要があります。

どうして?

19
delusionX

コマンドの順序が間違っているだけです。 jupyterでpyplotをインポートする前に、バックエンドを設定する必要があります。または、言い換えると、バックエンドを変更した後、pyplotを再度インポートする必要があります。

したがって、%matplotlib ... pyplotをインポートする前。

最初のセル:

%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

2番目のセル:

%matplotlib notebook
#calling it a second time may prevent some graphics errors
%matplotlib notebook  
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

enter image description here

編集:実際、jupyterでバックエンドを動的に変更できることがわかりました。私はそれが関連していると思うので、まだ答えをここに残し、時々飛び出すことができるいくつかのmatplotlibの魔法を説明しています。

ソースコード に示されているマジックコマンドは、matplotlib.pyplot.switch_backend(newbackend)を呼び出してバックエンドを変更します。 matplotlibの docs に記載されているとおり:

matplotlib.pyplot.switch_backend(newbackend)

デフォルトのバックエンドを切り替えます。この機能は実験的なものであり、イメージバックエンドへの切り替えでのみ機能すると予想されます。たとえば、インタラクティブなipythonセッションから実行したいPostScriptスクリプトがたくさんある場合は、実行する前にPSバックエンドに切り替えて、GUIウィンドウのポップアップが表示されないようにすることができます。あるGUIバックエンドから別のGUIバックエンドにインタラクティブに切り替えようとすると、爆発します。

Matplotlibには使用後にバックエンドを切り替える問題があるため、バックエンドを切り替えるたびにカーネルを再起動する必要があります。

この問題は主に、GUIバックエンドの異なるメインループ間の非互換性が原因です。通常、各バックエンドもスレッドとユーザー入力を処理しているため、QtとTkinterを並行して実行することはできません。そのため、その制限はjupyterに引き継がれます。

この質問も参照してください: matplotlib/Pythonでバックエンドを切り替える方法

4
lolopop

Jupyterノートブックでは、実行するものと同じ行にmatplotlibノートブックを入力する必要があります。 「インライン」と入力してから「ノートブック」と入力しても、機能しません。レンダリングするコードと同じ行になければなりません。

0
Michelle Abaya