私はデータキャンプでPythonを使ってデータサイエンスを学び始めたばかりですが、matplotlib.pyplotの関数を使用しているときにあることに気づきました。
import matplotlib.pyplot as plt
year = [1500, 1600, 1700, 1800, 1900, 2000]
pop = [458, 580, 682, 1000, 1650, 6,127]
plt.plot(year, pop)
plt.show() # Here a window opens up and shows the figure for the first time
しかし、もう一度表示しようとすると表示されません。
plt.show() # for the second time.. nothing happens
show()
そして、図を再び表示できるようにするには、上の行を再入力する必要があります
これは正常なことでしょうか、それとも問題でしょうか?
注: REPLを使用しています
ベストアンサー1
答え
はい、これは matplotlib の図の通常の予想される動作です。
説明
実行すると、plt.plot(...)
一方ではlines
実際のプロットのインスタンスが作成されます。
>>> print( plt.plot(year, pop) )
[<matplotlib.lines.Line2D object at 0x000000000D8FDB00>]
...そして一方ではFigure
、インスタンスは「現在の図」として設定され、次のようにアクセスできますplt.gcf()
(「現在の図を取得」の略):
>>> print( plt.gcf() )
Figure(432x288)
線(および追加する他のプロット要素)はすべて現在の図に配置されます。がplt.show()
呼び出されると、現在の図が表示されます。そして空になりました(!)、これが の 2 回目の呼び出しではplt.show()
何もプロットされない理由です。
標準的な回避策
これを解決する 1 つの方法は、現在のインスタンスを明示的に保持しFigure
、次のように で直接表示することですfig.show()
。
plt.plot(year, pop)
fig = plt.gcf() # Grabs the current figure
plt.show() # Shows plot
plt.show() # Does nothing
fig.show() # Shows plot again
fig.show() # Shows plot again...
より一般的に使用される代替方法は、プロット コマンドの前に、最初に現在の図を明示的に初期化することです。
fig = plt.figure() # Initializes current figure
plt.plot(year, pop) # Adds to current figure
plt.show() # Shows plot
fig.show() # Shows plot again
これは多くの場合、図の追加パラメータの指定と組み合わせられます。次に例を示します。
fig = plt.figure(figsize=(8,8))
Jupyter Notebook ユーザー向け
このfig.show()
アプローチは、Jupyter Notebook のコンテキストでは機能しない可能性があり、代わりに次の警告が生成され、プロットが表示されない可能性があります。
C:\redacted\path\lib\site-packages\matplotlib\figure.py:459: UserWarning: matplotlib は現在非 GUI バックエンドを使用しているため、図を表示できません
fig
幸いなことに、コード セルの末尾に ( の代わりに)と書くだけで、fig.show()
図がセルの出力にプッシュされ、表示されます。同じコード セル内から複数回表示する必要がある場合は、関数を使用して同じ効果を得ることができますdisplay
。
fig = plt.figure() # Initializes current figure
plt.plot(year, pop) # Adds to current figure
plt.show() # Shows plot
plt.show() # Does nothing
from IPython.display import display
display(fig) # Shows plot again
display(fig) # Shows plot again...
関数を活用する
図を複数回実行したい理由の 1 つは、show
毎回さまざまな変更を加えるためです。これは、fig
上で説明した方法を使用して実行できますが、より広範なプロット定義の場合は、基本図を関数でラップして繰り返し呼び出す方が簡単な場合がよくあります。
例:
def my_plot(year, pop):
plt.plot(year, pop)
plt.xlabel("year")
plt.ylabel("population")
my_plot(year, pop)
plt.show() # Shows plot
my_plot(year, pop)
plt.show() # Shows plot again
my_plot(year, pop)
plt.title("demographics plot")
plt.show() # Shows plot again, this time with title