plotly 使用入门

这两天看了一下数据可视化工具plotly,感觉还不错,比matplotlib炫酷多了,在此记录一下简单用法。

介绍plotly

plotly是一款基于D3.js框架的Python库,所以功能肯定很强大、炫酷。结合jupyter notebook效果更好。pip安装

pip install plotly

以为pip安装一下就行了,迫不及待就去跑示例代码,结果报错,提示没有登录什么的,了解之后才知道,plotly有两种模式。

离线模式:没有数量限制,图片都在本地。
在线模式:最多可以上传25张,可以通过浏览器在线编辑、观看。更好的分享给别,有分为三种情况——公开(public)、私人(private)、秘密(secret)。

在线plotly

首先需要注册一个plotly的账户,然后可以看到自己的UsernameAPI Keys,放到代码里面就可以作图了。

import plotly 
plotly.tools.set_credentials_file(username='yourAccount', api_key='u8U00uFdqKcYH5qykuu4')

plotly.tools.set_config_file(world_readable=True,
                             sharing='public')

import plotly.plotly as py
import plotly.graph_objs as go

trace0 = go.Scatter(
    x=[1, 2, 3, 4],
    y=[10, 15, 13, 17]
)
trace1 = go.Scatter(
    x=[1, 2, 3, 4],
    y=[16, 5, 11, 9]
)
data = [trace0, trace1]

py.plot(data, filename = 'basic-line', auto_open=True)

上面会输出一个网址,打开就可以看到了。最厉害的是竟然可以直接在线可视化编辑,厉害了!更多功能自己点击左侧按钮实验吧。


在线编辑

离线模式

大部分我们还是使用离线模式,比较在线模式有数量限制,还得打开网页才能看到,其中离线模式我喜欢在jupyter notebook中使用。

import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot

plot([go.Scatter(x=[1, 2, 3], y=[3, 1, 6])])

输出'file:///data/notebook/dataVisualization/temp-plot.html',是一个HTML,不是很方便,使用iplot画图就方便多了

init_notebook_mode(connected=True)# 设置为离线模式
iplot([{"x": [1, 2, 3], "y": [3, 1, 6]}])

直接输出图片了。

举几个例子

在jupyter notebook输出会有缩放、移动、截图等功能按钮,但是markdown不能显示,就简单截个图吧。
Plotly的核心是一个数据可视化工具箱,每个plotly图像的背后都是一个JSON对象,一个类似字典的数据结构。仅仅通过修改这个对象的一些关键字,就可以得到非常不同的、详细的图。例如:

import plotly.offline as py
import plotly.graph_objs as go

py.init_notebook_mode(connected=True)

trace1 = go.Scatter(x=[1,2,3], y=[4,5,6], marker={'color': 'red', 'symbol': 104, 'size': 10}, 
                    mode="markers+lines",  text=["one","two","three"], name='1st Trace')
                                               
layout=go.Layout(title="First Plot", xaxis={'title':'x1'}, yaxis={'title':'x2'})
figure=go.Figure(data=[trace1],layout=layout)
py.iplot(figure, filename='pyguide_1')
first plot
figure

输出

Figure({
    'data': [{'marker': {'color': 'red', 'size': 10, 'symbol': 104},
              'mode': 'markers+lines',
              'name': '1st Trace',
              'text': [one, two, three],
              'type': 'scatter',
              'uid': '6e76d08b-2f9b-429e-ae31-0d2faeb41e78',
              'x': [1, 2, 3],
              'y': [4, 5, 6]}],
    'layout': {'title': {'text': 'First Plot'}, 'xaxis': {'title': {'text': 'x1'}}, 'yaxis': {'title': {'text': 'x2'}}}
})

可以看到我们使用py.iplot画的图确实是一个类似于字典的对象,此外,我们可以通过添加/定义与散点图相关的关键字的值,来修改这个图片。
如果我们想改变散点图的标题,同时使用绿色的先代替红色的先,可以通过Plot update来实现。

figure.update(dict(layout=dict(title='Plot update'), data=[dict(marker=dict(color='blue'))]))
py.iplot(figure, filename='pyguide_2')
plot update

此外,Plotly plots 是交互式的,这意味着你可以在图像上通过平移、选择、缩放来手动操作探索数据。

很快你就能弄明白如何以你想要的方式绘制图表,怎么分享这些信息给你想分享的人。例如,我们可以快速查看一下如何定义生成散点图所需的对象,以比较两个大陆之间的预期寿命了人均GDP。

import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/yankev/test/master/life-expectancy-per-GDP-2007.csv')

americas = df[(df.continent=='Americas')]
europe = df[(df.continent=='Europe')]

trace_comp0 = go.Scatter(
    x=americas.gdp_percap,
    y=americas.life_exp,
    mode='markers',
    marker=dict(size=12,
                line=dict(width=1),
                color="navy"
               ),
    name='Americas',
    text=americas.country,
    )

trace_comp1 = go.Scatter(
    x=europe.gdp_percap,
    y=europe.life_exp,
    mode='markers',
    marker=dict(size=12,
                line=dict(width=1),
                color="red"
               ),
    name='Europe',
    text=europe.country,
        )

data_comp = [trace_comp0, trace_comp1]
layout_comp = go.Layout(
    title='Life Expectancy v. Per Capita GDP, 2007',
    hovermode='closest',
    xaxis=dict(
        title='GDP per capita (2000 dollars)',
        ticklen=5,
        zeroline=False,
        gridwidth=2,
    ),
    yaxis=dict(
        title='Life Expectancy (years)',
        ticklen=5,
        gridwidth=2,
    ),
)
fig_comp = go.Figure(data=data_comp, layout=layout_comp)
py.iplot(fig_comp, filename='life-expectancy-per-GDP-2007')
Life Expectancy v. Per Capita GDP, 2007

希望这能让您了解如果使用Plotly Python Library绘制图表,稍后,我们将在后面的章节详细介绍构成这个图表的不同部分。但是现在,我希望您能看到它的可定制性,以及我们如何通过编程定义这些图。

Plotly强大能力的来源

Plotly生成的所有图表实际上都是plotly.js这个javascript库产生的,无论是在浏览器还是Ipython notebook中,所有的可视化、交互都是基于plot.js,plot.js建立在d3.js和stack.gl之上,plotly.js是一个高级的声明性图表库,提供了20多种图表类型,包含了3D图表、统计图和SVG地图。

使用Python API

Python API是一个设计用来和Plotly.js库交互的包,以便允许Python用户在他们喜欢的环境中创建绘图。这个包提供函数和图形对象,可以简化图形生成的过程,这相当于在JSON对象中正确定义关键字(如上面的例子所示),这将允许我们以函数的方式创建我们的图。所以我们来分解一下。

import plotly.offline as py
import plotly.graph_objs as go

为了生成我们的Plotly图表,我们需要两个主要的模块。
. plotly.offline包含了与Plotly服务器通信的功能。
. plotly.graph_objs 包含了生成图表对象的函数
注意:如果我们检查上一节中的示例代码,我们可以看到下面的部分。
. Data
. Layout
. Figure

DATA

go.Scatter(x=[1,2,3], y=[4,5,6], marker={'color': 'red', 'symbol': 104, 'size': "10"}, 
                                               mode="markers+lines",  text=["one","two","three"])

输出

Scatter({
    'marker': {'color': 'red', 'size': 10, 'symbol': 104},
    'mode': 'markers+lines',
    'text': [one, two, three],
    'x': [1, 2, 3],
    'y': [4, 5, 6]
})

定义了一个散点图的轨迹,此外,它定制了我们需要绘制的数据,即3个数据点(1,4),(2,5),(3,6),以及绘制该数据相关的规范。在这个例子中,我们想把这些点画成空闲的x,用红色的线把他们串起来。
此外,我们还可以向数据列表中,添加另一个散点对象,我们可以通过定义一个新的散点对象来实现这一点,并将其包含到数据对象的定义中。

import numpy as np
x = np.arange(1,3.2,0.2)
y = 6*np.sin(x)
y

输出

array([5.04882591, 5.59223452, 5.91269838, 5.99744162, 5.84308579,
       5.45578456, 4.85097842, 4.05277908, 3.09300823, 2.0099289 ,
       0.84672005])

输出

trace2 = go.Scatter(x=x, y=y, marker={'color': 'blue', 'symbol': 'star', 'size': 10}, mode='markers', name='2nd trace')
data = go.Data([trace1, trace2])
data

输出

[Scatter({
     'marker': {'color': 'red', 'size': 10, 'symbol': 104},
     'mode': 'markers+lines',
     'name': '1st Trace',
     'text': [one, two, three],
     'x': [1, 2, 3],
     'y': [4, 5, 6]
 }), Scatter({
     'marker': {'color': 'blue', 'size': 10, 'symbol': 'star'},
     'mode': 'markers',
     'name': '2nd trace',
     'x': array([1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8, 3. ]),
     'y': array([5.04882591, 5.59223452, 5.91269838, 5.99744162, 5.84308579, 5.45578456,
                 4.85097842, 4.05277908, 3.09300823, 2.0099289 , 0.84672005])
 })]
plot2 = py.iplot(go.Figure(data=data, layout=layout), filename='pyguide_3')
plot2
First Plot

Layout

这个Layout就是定义图的外观,以及与数据无关的图功能。因此,我们可以改变标题、轴标题、间距、字体等。

layout=go.Layout(title="First Plot", xaxis={'title':'x1'}, yaxis={'title':'x2'})
layout

输出

{'title': 'First Plot', 'xaxis': {'title': 'x1'}, 'yaxis': {'title': 'x2'}}

Annotations

我们为轴添加了标题,还添加一个一个文本注释,指出最大点。

layout.update(dict(annotations=[go.Annotation(text="Highest Point", x=3, y=6)]))
py.iplot(go.Figure(data=data, layout=layout), filename='pyguide_4')
First Plot

推荐一篇与pandas结合的文章,写的很好。The Next Level of Data Visualization in Python

参考

Getting Started with Plotly for Python
Plotly User Guide in Python
官方文档

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

推荐阅读更多精彩内容