前面学习的可视化工具,所绘制的图都是发布到本地的。如果别人想看,有两种方法:一种是跑到自己的计算机这边来看;另一种是导出图片发给对方。在当今网络如此发达的时代,还用这种古代的方式传播信息,的确有点太不上档次了。
如果读者在这之前已经意识到问题了,说明你是一个善于发现问题的人。但这还不够,还要善于解决问题。当然,这个问题也不是今天才发现的,比如 Alex Johnson、Jack Parmer、Chris Parmer 和 Matthew Sundquist,他们早在大约 2013 年就意识到了,并且动手解决,于是 Plotly 诞生了(参考:维基百科)。
Plotly 解决了数据可视化作品的在线分享问题,这就是它的独特之处。
4.1.1 初始化
Plotly 的底层是 plotly.js,plotly.js 基于 D3.js、stack.gl 和 SVG,能够用 JS 在网页上实现类似 Matlab 和 Matplotlib 的图形。Plotly 提供了 Python、Matlab、R 语言等 API。
Plotly 原本是收费的,自 2016 年 6 月开始,提供免费的社区版。
如果要使用它,首先要在网站官方网站 https://plot.ly/ 注册账号,然后就可以在线发布绘制的图示了。
enter image description here
登录网站之后,在用户个人信息中的下拉菜单选择“setting”项目,进入下面的界面。
image
记录下自己的 Username 和 API KEY(可以重置),这样就做好了在线账号设置工作。
下一步就是要在本地安装 Plotly,在本课程第 0-3 课中已经介绍过,如果尚未安装,请用如下指令:
pip3 install plotly
安装完毕,进行在线账号初始化。
import plotly
plotly.tools.set_credentials_file(username="your_username", api_key='your_apikey')
这步操作如果成功,则不返回任何结果。初始化的结果是在本地生成了 ~/.plotly/.credentials 文件。
4.1.2 三种模式
完成初始化之后,就可以进行绘图,并实现在线分享。
import plotly.plotly as py
import plotly.graph_objs as go
t0 = go.Scatter(x = [1, 2, 3, 4],
y = [10, 15, 13, 17])
t1 = go.Scatter(x = [1, 2, 3, 4],
y = [16, 18, 13, 17])
data = [t0, t1]
py.plot(data, filename="example_image") #①
执行上述代码之后,会输出一个 URL:'https://plot.ly/~qiwsir/12'(每个人的 URL 会有所不同)。同时,会自动打开浏览器一个新标签,在那里会展现这个 URL 的页面内容,就是上述程序所绘制的图形。如果没有自动打开,可以把返回的 URL 复制到地址栏中访问此页面。
image
如果看到了此页面,就可以把 URL 分享给任何人,他们都能打开网页看到同样的图像。而且,因为这张图是基于 JavaScript 的,在手机那种小屏幕上看,也一样能够自适应。
惊喜还不止这些。 如果用鼠标点击图例,就会发现可以选择要显示的图线。另外,上面还有放大、截图、移动、下载、分享多个小工具等。
我们可以把 Plotly 的官方网站看做免费公开图示的托管网站,在里面可以看到很多高手发布的精美图示。每个用户在这里都有个人作品的专有页面,比如本教程作者的个人作品集:https://plot.ly/~qiwsir#/,打开之后会看到我个人发布的图示(很抱歉,没有好东西)。
enter image description here
图中标示了 filename,它所显示的就是 py.plot(data, filename="example_image") 中所设置的图示文件名称。
刚才生成的图示,直接发布到 plot.ly 上,把这种方式称为“在线模式”。与之相对,还有另外一种模式,不发布到该网站上,而是在本地生成一个 HTML 文件,并将图示置于其中,这种模式称为“离线模式”。操作如下:
import plotly
import plotly.graph_objs as go
plotly.offline.plot({"data": [go.Scatter(x=[1,2,3,4], y=[6,7,8,9])],
"layout": go.Layout(title="laoqi_third_image")},
auto_open = True)
执行之后,会返回 HTML 文件的地址,例如:'file:///Users/qiwsir/Documents/Projects/gitchat/data-visual/temp-plot.html',并且同时在浏览器中打开这个文件 auto_open = True。
在线模式或离线模式,都是要在新的浏览器地址打开。如果觉得这样的方式不方便调试,还可以使用第三种模式——嵌入模式。
plotly.offline.init_notebook_mode(connected=True)
plotly.offline.iplot({
"data": [go.Scatter(x=[1, 2, 3, 4], y=[4, 3, 2, 1])],
"layout": go.Layout(title="hello world")
})
执行之后,在当前代码的下面会插入下图所示(因为不同计算机的计算能力差异,有时候可能需要等几秒钟才能呈现图示):
image
效果貌似跟前面使用 Matplotlib 等差不多,但是这里插入的不是一张静态图片,而是跟“在线模式”或者“离线模式”一样的 H 前段代码(HTML + JS),同样具有交互功能。只不过,这种模式对于调试更便捷。
4.1.3 基本结构
在上述的制图代码中,主要是用 Plotly 提供的一些 API 完成绘图,这一点与以往的工具是一样的。区别就在于,这里还提供了一些基于网站 plot.ly 的 API,从而能够实现在线模式的制图。
如果对绘制图示的过程进行分析,可以将其概括为如下几部分。
1. API 函数
基于 Plotly 制图,不论是最后生成在线的还是本地的图示,都是按照如下流程。
向服务器的 API 提交数据和有关参数配置——以 JSON 格式。如果是生成本地图示,就提交给本地的 Plotly 程序并生成 HTML 文件;如果是生成在线图示,就是向 Plotly 服务器提交,并返回网址。
服务器接收到信息,验证正确后生成图示。
返回地址(可以是在线的 URL,也可以是本地 HTML 文件地址,或者插入到当前浏览器)。
以在线模式为例:
import plotly.plotly as py
用这种方式引入了 plotly.plotly 库,并更名为 py。这个库包含了与 Plotly 官方服务器相连接的函数,例如在线模式中的 ①(py.plot(data, filename="example_image"))所使用的函数 py.plot,其作用就是向 Plotly 官网提交有关绘图的数据,以及对图示的各种配置信息。服务器接受之后,会创建一个在线图示(唯一的一个 URL),默认自动打开。
plot(figure_or_data, validate=True, **plot_options)
常用参数见下。
figure_or_data:向 Plotly 官方网站提交的数据,通常以 JSON 组成的列表形式提交。
filename:图示的名称。
fileopt:文件保存模式,可选的模式(字符串)有以下几个选项。
new:新创建一个 URL。
overwrite:覆盖原有的同 filename 的图示。
extend:对已有图示的 traces 增加数据—— traces 是什么?继续阅读就能明白。
append:对已有图示的数据列表中追加 traces ——跟 extend 不同。假设已有图示的数据列表是 [trace1, trace2],append 的作用就是向这个列表中追加 trace,使其变成 [trace1, trace2, trace3]。
auto_open:默认 auto_open = True,即自动打开 URL。
sharing:设置 URL 的访问权限,可选值有以下几个。
'public':任何人都可以访问,并且显示在个人页面,允许 Plotly 搜索。
'private':只有发布者个人用户可以访问。
'secret':拥有此链接的人能够访问,但 Plotly 网站上不会展示,也不搜索此图。
除了此函数之外,类似的还有 plotly.offline.plot 和 plotly.offline.iplot,不同之处在于向本地的 Plotly 服务提交有关数据和图示的参数设置等。而后根据设置生成图示。
2. JSON 格式的数据
通过 Plotly 的 API 所提交的数据,可以有多种类型(对象)。
列表中的字典。 例如(使用嵌入模式,后续不特别说明,都以这种模式演示):