Python 数据可视化:Plotly 初体验

前面学习的可视化工具,所绘制的图都是发布到本地的。如果别人想看,有两种方法:一种是跑到自己的计算机这边来看;另一种是导出图片发给对方。在当今网络如此发达的时代,还用这种古代的方式传播信息,的确有点太不上档次了。

如果读者在这之前已经意识到问题了,说明你是一个善于发现问题的人。但这还不够,还要善于解决问题。当然,这个问题也不是今天才发现的,比如 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 所提交的数据,可以有多种类型(对象)。

列表中的字典。 例如(使用嵌入模式,后续不特别说明,都以这种模式演示):

还有 46% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
支付 ¥2.99 继续阅读
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容