大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。
前面大家一起学习了Matplotlib的常见用法,本次将学习如何用Plotly绘制更加美观的统计图。
具体的,我们会学习:
如何使用Plotly进行布局
如何使用Plotly进行数据点设置
强调两点:
在开始之前,先通过一个小例子来理解Plotly的工作原理,便于后续讲解。Plotly可联网、离线运行。联网模式需要生成证书进行授权后才能使用,因此需要先到Plotly官网注册,并获取API Key,不在此细讲了。注册完毕后,在下列代码中输入你的账号和API Key即可,以后画的图都可以上传到Plotly Cloud。可能小伙伴们会觉得有些麻烦,毕竟Plotly是商业软件,连Google都在用它家的产品,就由它任性吧o(* ̄︶ ̄*)o。
既然我们受不了它的任性,这里推荐使用离线模式进行绘图,不需要注册账号密码,绘图速度也更快。
表1 理解Plotly
例1 理解Plotly
1import pandas as pd
2import os
3import plotly.graph_objs as go
4from plotly.offline import iplot, init_notebook_mode
5
6
7init_notebook_mode()
8
9
10layout = go.Layout(
11 title = '理解Plotly',
12)
13
14
15trace1 = go.Scatter(
16 x = [1, 2, 3, 4],
17 y = [1, 2, 3, 4],
18 mode = 'lines',
19)
20
21
22fig = go.Figure(data=[trace1], layout=layout)
23
24
25iplot(fig)
运行结果如图1所示。
图1 理解Plotly
这里由于截图的原因,无法完全展示Plotly的特性,建议边看边运行代码。
无论绘制怎样的图,使用Plotly绘制图像只需4步:
设置图的Layout。这里的Layout可以理解为一张图片除数据点外的元素,比如图的标题、XY轴的刻度、标签、图例,等。简单理解,Matplotlib中函数接口为ax.set_XX的都可以认为是Layout管理的。
设置图的Trace。这里的Trace其实可以认为是图形的组成方式——点、线、面,无数点构成线,无数线构成面。散点图就是用Scatter的接口,饼图就是Pie的接口,具体在之后使用中进行介绍。
组成画布。这一步是将Layout、Trace进行结合。
绘制图像。
通过这样的设计,使得Plotly不用再像Matplotlib那样,设置一个元素就得调用一个接口,而是一个参数名对应一个元素设置,这样就能非常方便的进行绘图管理。此外,Plotly的实现是基于Json的,这也使得Plotly参数设置可以像Json那样——字典和列表相互嵌套,具备良好的可读性。
敲黑板:Plotly调用的方式可以是dict(参数名=具体参数),也可是{’参数名‘: 具体参数},通常情况下两种都是可以的,但在某些情况下,前一种会显示语法错误(这可能是Plotly的bug),而且有些参数会和Python内置的函数名冲突,为简单起见,最好都选用后一种。参加下面的例子。
Layout函数有上百个参数,其中又有大量的参数嵌套着参数。这里罗列一些常用的参数,基本能满足大部分需求。
表2 Layout函数参数说明
注意:细分参数栏中还有参数时,在具体编写程序过程中,采用字典嵌套的方式。下面是多层嵌套的小例子:
1layout = go.Layouot(
2 font = {
3 'family': 'Arial',
4 'size': 20,
5 'color': 'rgb(152, 0, 0)'
6 },
7 title = '简单演示',
8 xaxis = {
9 'title': '这是X轴',
10 'titlefont': {
11 'family': 'Times New Roman',
12 'size': 18,
13 },
14 },
15)
当小伙伴们能轻松读懂这个Demo中的代码后,Plotly的学习基本完成了80%。可能你会惊讶:“哇,这么快就80%了?散点图、箱线图什么的还没学呢!”没错,Plotly真就这么简单,每个函数的内部构造都是基于字典形式的,接下来的学习只是函数接口略有区别,参数重合度非常高,学习起来毫无压力。
从这一节开始,如不明确说明,所有的数据都使用上一节中对应的数据。Scatter()函数也有上百个参数,这里只展示常用参数。
表3 散点图、线图参数说明
例2 散点图
1
2layout = go.Layout(
3 title = '评价数人均关系图',
4 xaxis = {
5 'title': '人均',
6 'range': [20, 60],
7 'nticks': 20,
8 },
9 yaxis = {
10 'title': '评价数',
11 'range': [0, 6500]
12 },
13 showlegend = True
14)
15
16
17trace1 = go.Scatter(
18 x = merge_data['人均'],
19 y = merge_data['评价数'],
20
21 mode = 'markers',
22 marker = {
23 'color': 'rgba(152, 0, 0, .8)',
24 'size': 10,
25 'symbol': 'circle',
26 },
27 name = '人均',
28)
29
30fig = go.Figure(data=[trace1], layout=layout)
31iplot(fig)
运行结果如图2。
图2 散点图
是不是感觉看上去就比Matplotlib高大上许多呢,(*^▽^*)。
注:散点图和线图几乎唯一的区别是mode的参数设置一个'markers',一个是'lines',所以这里就不再细讲线图的绘图方法。
好了,今天就讲到这里。
作业:打开Jupyter构建自己的画布,画出上述例子中的评价数与人均的散点图。请在评价数最高的点上标注出其(人均,评价数)数值。