Как я могу показать одну и ту же фигуру matplotlib несколько раз в оболочке IPython?
Я запустил следующий код для построения одной строки с объектно-ориентированным API matplotlib.
$ ipython --pylab
In [1]: fig = plt.figure() # An empty figure is shown in popped up window here
In [2]: ax = fig.add_subplot(1,1,1)
In [3]: ax.plot(arange(10)) # no figure is shown up here
Out[3]: [<matplotlib.lines.Line2D at 0x7fb134118400>]
In [4]: fig.show()
когда fig = plt.figure()
выполняется, появляется новое окно, и оно показывает пустую фигуру. После построения ax.plot(arange(10))
, никакая фигура не отображается автоматически, поэтому я попытался показать фигуру fig.show()
и я получил эту ошибку.
AttributeError Traceback (most recent call last)
<ipython-input-6-6ebedab27258> in <module>()
----> 1 fig.show()
~/.pyenv/versions/3.6.4/envs/analysis/lib/python3.6/site-packages/matplotlib/figure.py in show(self, warn)
409 if manager is not None:
410 try:
--> 411 manager.show()
412 return
413 except NonGuiException:
~/.pyenv/versions/3.6.4/envs/analysis/lib/python3.6/site-packages/matplotlib/backends/backend_tkagg.py in show(self)
560 self.canvas.draw_idle()
561 # Raise the new window.
--> 562 self.canvas.manager.window.attributes('-topmost', 1)
563 self.canvas.manager.window.attributes('-topmost', 0)
564 self._shown = True
AttributeError: 'NoneType' object has no attribute 'attributes'
Но такой уродливый однострочник правильно показывает линейный график.
plt.figure().add_subplot(1,1,1).plot(arange(10))
Кажется, что оболочка IPython не может показывать одну и ту же цифру несколько раз. Как я могу избежать этого поведения?
1 ответ
Проблема заключалась в том, как я относился к окнам с пустой фигурой. Я всегда закрывал его сразу после выполнения fig = plt.figure()
, Я не должен этого делать. Держать его открытым позволяет ax.plot()
нарисовать линию на открытой фигуре.