円グラフの図をプロットするために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
に変更されます。このセルを実行した後、図はレンダリングされず、カーネルを再起動してこのセルを再度実行する必要があります。
どうして?
コマンドの順序が間違っているだけです。 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])
編集:実際、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でバックエンドを切り替える方法
Jupyterノートブックでは、実行するものと同じ行にmatplotlibノートブックを入力する必要があります。 「インライン」と入力してから「ノートブック」と入力しても、機能しません。レンダリングするコードと同じ行になければなりません。