用Google Colab,怎样让机器学习图表动起来?

作者 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 + b
  m = np.cos(at_x)
  b = np.sin(at_x) - np.cos(at_x)*at_x
  gradient_line = m*x + b

  line2.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 sequentially
def animate(i):
  at_x = x[i]

  # gradient_line will have the form m*x + b
  m = np.cos(at_x)
  b = np.sin(at_x) - np.cos(at_x)*at_x
  gradient_line = m*x + b

  line2.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中运行这个代码,可生成下面的内嵌动画图。

相关链接:

1. 本文的配套Colab文档:

https://colab.research.google.com/drive/131wXGA8h8d7llSZxZJ6R4e8nz0ih1WPG

2. 动图内嵌为交互式JavaScript小部件的方法:

http://tiao.io/posts/notebooks/embedding-matplotlib-animations-in-jupyter-as-interactive-javascript-widgets/

3. 原文:

https://towardsdatascience.com/making-animations-work-in-google-colaboratory-new-home-for-ml-prototyping-c6147186ae75

作者系网易新闻·网易号“各有态度”签约作者

本文分享自微信公众号 - 量子位(QbitAI)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏HT

HT图形组件设计之道(四)

在《HT图形组件设计之道(二)》我们展示了HT在2D图形矢量的数据绑定功能,这种机制不仅可用于2D图形,HT的通用组件甚至3D引擎都具备这种数据绑定机制,此篇我...

21650
来自专栏老司机的简书

老司机带你走进Core Animation 之粒子发射、TileLayer与异步绘制

老司机带你走进Core Animation 之粒子发射、TileLayer与异步绘制

13220
来自专栏天天P图攻城狮

android视频系列:视频解码篇--android上视频播放的实现

前言 要开始正儿八经地写视频系列文章了。思来想去,从播放器入手,再合适不过了。视频文件,只有播放出来,才显示出了意义;只有播放出来,才暴露出各种问题。先理解播放...

577110
来自专栏互联网杂技

设计师也能轻松掌握的前端小知识

阅读须知: 工具不重要,工具不重要,工具不重要……OK?有人说DW早就淘汰了,我造啊,然后呢?我还打算用小红本(editPlus)讲呢,哈哈哈哈…… 希望乃们接...

36980
来自专栏葡萄城控件技术团队

【.NET开发之美】使用ComponentOne提高.NET DataMap中的加载速度

所有内置网格编辑器都实现IC1EmbeddedEditor接口,ComponentOne Input库中的控件也是如此。 如果我们想要使用带有C1FlexGri...

12030
来自专栏Android机动车

Android的16ms和垂直同步以及三重缓存

手机屏幕是由许多的像素点组成的,每个像素点通过显示不同的颜色最终屏幕呈现各种各样的图像。手机系统的类型和手机硬件的不同导致UI的流畅性体验个不一致。

31220
来自专栏张高兴的博客

使用 Babylon.js 在 HTML 页面加载 3D 对象

28250
来自专栏Jerry的SAP技术分享

分享一个开源的JavaScript统计图表库,40行代码实现专业统计图表

这可能是史上最简单易用的开源统计图表绘制库了。柱状图,饼状图,点状图等等您能想到的类型全部支持。

25730
来自专栏hightopo

HT图形组件设计之道(四)

14850
来自专栏技术总结

UIKit Dynamics 置身真实世界

284100

扫码关注云+社区

领取腾讯云代金券