3

是否可以在 Google Colaboratory 中使用%matplotlib notebook和 MatplotlibFuncAnimations进行动画可视化?

当我尝试时,我得到

Traceback (most recent call last):  
  File "/usr/local/lib/python3.6/dist-packages/matplotlib/cbook/__init__.py", line 388, in process  
    proxy(*args, **kwargs)  
  File "/usr/local/lib/python3.6/dist-packages/matplotlib/cbook/__init__.py", line 228, in __call__  
    return mtd(*args, **kwargs)  
  File "/usr/local/lib/python3.6/dist-packages/matplotlib/animation.py", line 1560, in _stop  
    self.event_source.remove_callback(self._loop_delay)  
AttributeError: 'NoneType' object has no attribute 'remove_callback'

我的笔记本在 macOS 上使用 Anaconda 的本地 Jupyter 安装上运行良好。

4

2 回答 2

3

我有同样的问题。最后,我可以拼凑出一个可行的解决方案。
它还与 FuncAnimations 不兼容,但也许你会看到它是如何工作的,所以我已经发布了它,稍后会修改它。

将所有这些放在一个单元格中并运行。
一旦开始更改代码,请确保IPython.display函数从同一个单元格运行,因为 Colaboratory 会为每个输出创建隔离的 iframe,并且 html 和 javascript 输出都必须在同一个 iframe 中结束。

import io
import numpy as np
import time
import base64
import matplotlib.pyplot as plt
import IPython

def fig2b64(f):
  data = io.BytesIO()
  f.savefig(data, format='png')
  data.seek(0)
  return base64.b64encode(data.read()).decode()

f = plt.figure(num=1, clear=True)
x = np.arange(10)
y = np.arange(10)
line = f.gca().plot(x, y)[0]

data_str = fig2b64(f)

IPython.display.display_html(f'<img class="myimage" src="data:image/png;base64,{data_str}"></img>', raw=True)

for _ in range(10):
  time.sleep(1)
  np.random.shuffle(y)
  line.set_data(x, y)
  data_str = fig2b64(f)
  IPython.display.display_javascript(f'''
    document.querySelector('.myimage').src = 'data:image/png;base64,{data_str}';
  ''', raw=True)

# suppress final output
plt.close(1)
于 2018-04-05T12:15:48.410 回答
1

尝试使用

%matplotlib inline

代替

%matplotlib notebook

于 2018-03-20T15:22:30.573 回答