今天在用colab做深度学习时,想要利用matplotlib.animation生成一个动图,但是一直无法使用,就在网上查找资料,看到了这篇教程,感觉很不错就转载过来了。
作者 Navjot
王小新 编译自 TowardsDataScience
量子位 出品 | 公众号 QbitAI
Google Colab发布短短半年时间,受到了众多机器学习小伙伴的追捧。
毕竟它无需安装、功能强大、支持实时协作,还能免费蹭Google云上的GPU,比Jupyter Notebooks不知高到哪里去了。
可是,Colab也有不友好的地方:机器学习第一步,也就是用可视化图表分析数据的时候,你就可能遇到困难。想在Colab里绘制动图,比在Jupyter Notebooks里难多了。
Jupyter Notebooks中,可以很容易地运行matplotlib库中的动图接口,但Colab中,就需要开动脑筋。
为了在Google Colab中绘制动图,名叫Navjot的小哥在Medium上提出了一种方法。
量子位搬运过来,以下为他博客的译文:
让图表动起来,我见过的最佳方法是这样的 :
from matplotlib import rc
rc('animation', html='jshtml')
下面,我们会分步详细介绍。
任务:绘制y= sin(x)曲线,并得到每个点切线的动画。
首先,导入函数库:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
定义自变量x的范围,并绘制sin(x)函数:
x = np.linspace(-4, 4, 100)
y = np.sin(x)
创建所需的绘图对象:
fig, ax = plt.subplots()
ax.set_xlim(( -4, 4))
ax.set_ylim((-2, 2))
再画出2条线,对应目标函数和它的切线:
line1, = ax.plot([], [], lw=2)
line2, = ax.plot([], [], lw=2)
接着,定义init函数,以设置动画中每一帧的背景:
def init():line1.set_data(x, y) return (line1,)
然后,定义animate函数,并按顺序进行调用,得到每一帧中看出的变化:
def animate(i):at_x = x[i]# gradient_line will have the form m*x + bm = np.cos(at_x)b = np.sin(at_x) - np.cos(at_x)*at_xgradient_line = m*x + bline2.set_data(x, gradient_line)return (line2,)
最后,调用matplotlib.animation中FuncAnimation函数来设置动画参数:
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=100, interval=100, blit=True)
在该阶段,我们得到了动画对象anim,而且为了把动画内嵌到网页中,我们把图表中默认的表示设置为交互式的JavaScript小部件,把animate.html中的rc参数改为jshtml来实现。
rc('animation', html='jshtml')
设置好上面内容后,我们就可以引用动画对象anim来显示内嵌动画图。
完整代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from IPython.display import HTML# animate over some set of x, y
x = np.linspace(-4, 4, 100)
y = np.sin(x)# First set up the figure, the axes, and the plot element
fig, ax = plt.subplots()
plt.close()
ax.set_xlim(( -4, 4))
ax.set_ylim((-2, 2))line1, = ax.plot([], [], lw=2)
line2, = ax.plot([], [], lw=2)# initialization function: plot the background of each frame
def init():line1.set_data(x, y) return (line1,)# animation function: this is called sequentiallyimport numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation, rc
from IPython.display import HTML# animate over some set of x, y
x = np.linspace(-4, 4, 100)
y = np.sin(x)# First set up the figure, the axes, and the plot element
fig, ax = plt.subplots()
plt.close()
ax.set_xlim(( -4, 4))
ax.set_ylim((-2, 2))line1, = ax.plot([], [], lw=2)
line2, = ax.plot([], [], lw=2)# initialization function: plot the background of each frame
def init():line1.set_data(x, y) return (line1,)# animation function: this is called sequentially
def animate(i):at_x = x[i]# gradient_line will have the form m*x + bm = np.cos(at_x)b = np.sin(at_x) - np.cos(at_x)*at_xgradient_line = m*x + bline2.set_data(x, gradient_line)return (line2,)anim = animation.FuncAnimation(fig, animate, init_func=init, frames=100, interval=100, blit=True)
rc('animation', html='jshtml')
anim
在Google Colab中运行这个代码,可生成下面的内嵌动画图。