作为Python的新一代数据可视化绘图库,和matplotlib等传统绘图库相比,plotly具有以下优点:
-
简洁易用: 作为一只 小透明,plotly的图表对象就像一个嵌套dict, 可以通过直接修改对象属性而改变图表形态。学习难度远远小于matplotlib.
-
动态交互: plotly绘制的图都是可以交互的图表,可以点击查看数据,拖拽放大,隐藏某些数据列等等,也可以导出成静态图,灵活性大大增加。
- 前端能力: 基于plotly和React开发的Dash号称是 The front end for ML and data science models,可以基于它用Python轻松构建机器学习应用App.
通常,plotly有两种常用的绘图接口:
- 第一种是面向对象的绘图接口:plotly.graph_objs(简称go),也是最基础的绘图接口,
- 第二种是面向函数式的快速绘图接口: plotly.express(简称px),是在go基础上封装的一种更方便的绘图接口。
本文我们按照如下3 part来深入浅出地讲解plotly的使用方法。
- part1: 深入原理, 本文第一节和第二节,分别介绍 go和px 的设计思想和绘图原理。
- part2: 浅出范例, 本文第三节和第四节,对比性地展示 go和px 的五种绘图范例(柱形图、折线图、散点图、热力图、直方图)
- part3: 深入实践, 本文第五节,展示一些plotly和机器学习相结合的综合应用范例。
参考文档:
plotly: https://plotly.com/python/
dash: https://dash.plotly.com/
dash机器学习应用:https://plotly.com/building-machine-learning-web-apps-in-python/
公众号后台回复关键词:plotly,获取本文教程jupyter notebook源码。
一,plotly.graph_objs绘图原理
plotly的Figure是由data(数据,数据包括图表类型(Line,Scatter,Area,Pie)和具体数据取值信息)和 layout(布局,包括xaxis,yaxis,title,legend等) 组成的对象。
Figure对象就像一个透明的嵌套的Python dict 一样,可以通过修改元素值而改变其形态。
import numpy as np
import plotly.graph_objs as go
epoches = np.arange(20)
accs = 1-0.9/(epoches+1)
data = go.Scatter(x = epoches, y=accs, mode = "lines+markers",name = "acc",
marker = dict(size=8,color="blue"),
line= dict(width=2,color="blue",dash="dash"))
layout = {"title":"accuracy via epoch",
"xaxis.title":"epoch",
"yaxis.title":"accuracy",
"font.size":15}
fig = go.Figure(data = data,layout=layout)
fig.show()
如果要把图表的颜色改成红色实线怎么办呢?很简单,我们先print(fig)一下,观察它的结构,找到线的颜色和线型的属性获取方法,然后直接对相应属性赋值就可以了。
print(fig.data) #如果想获取fig更详细结构信息,可以直接 fig.to_dict()
(Scatter({
'line': {'color': 'blue', 'dash': 'dash', 'width': 2},
'marker': {'color': 'blue', 'size': 8},
'mode': 'lines+markers',
'name': 'acc',
'x': array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19]),
'y': array([0.1 , 0.55 , 0.7 , 0.775 , 0.82 , 0.85 ,
0.87142857, 0.8875 , 0.9 , 0.91 , 0.91818182, 0.925 ,
0.93076923, 0.93571429, 0.94 , 0.94375 , 0.94705882, 0.95 ,
0.95263158, 0.955 ])
}),)
fig.data[0].line.color = "red"
fig.data[0].line.dash = "solid"
fig
怎么样,plotly是不是一个当之无愧的小透明。😝
以上这种直接对一个Figure对象的属性的值的修改方法多少显得有些粗暴,不够尊重小透明。
实际上,plotly的Figure对象提供了 fig.update_layout 和 fig.update_data 这样的方法来让 小透明面对突如其来的修改时候显得更加体面一些。
import numpy as np
import plotly.graph_objs as go
epoches = np.arange(20)
accs = 1-0.9/(epoches+1)
fig = go.Figure(data = go.Scatter(x = epoches, y=accs, mode = "lines+markers",name = "acc",
marker = dict(size=8,color="blue"),
line= dict(width=2,color="blue",dash="dash")))
fig.show()
fig.update_traces(patch={"line.color":"red","line.dash":"solid"},selector=dict(name="acc"))
fig.update_layout({"title":"accuracy via epoch",
"xaxis.title":"epoch",
"yaxis.title":"accuracy",
"font.size":15})
fig.show()
二,plotly.express绘图原理
使用 import plotly.graph_objs as go 的go接口来绘制图表实际上已经非常简单了,一般类型的图表三五行代码就可以搞定。
但我还是想偷懒,能否一行代码就搞定大部分常用图表呢。
当然可以,plotly.express就是为你准备的。英文单词express 意为 快线,特快列车。就像营养快线的英文,Nutri-express.
plotly.express的原理非常简单,Figure不是主要由 data(traces)和layout组成嘛。
data部分传入一个pandas的DataFrame,而layout部分可以用模板template指定嘛,一行代码搞定。
当然有时候template的一些微观形态可能与用户想要的还不完全一样,将生成的Figure当做小透明直接修改属性即可。
import plotly.express as px
import numpy as np
import pandas as pd
dfdata = pd.DataFrame({"epoch":np.arange(20),"accuracy":1-0.9/(np.arange(20)+1)})
fig = px.line(data_frame=dfdata,x="epoch",y="accuracy",title="accuracy via epoch")
fig.show()
可以看到,plotly.express已经帮我们把坐标轴标题什么的都设置好了。
但是整体看起来还是有些不太美观,多大的事呀,分分钟修改小透明!
fig.update_traces(patch=dict(mode = "lines+markers",
marker = dict(size=8,color="blue"),
line= dict(width=2,color="red",dash="solid")),
selector=dict(type="scatter")) #用patch指定补丁,用selector指定对那个数据打补丁
fig.update_layout({"font.size":15})
fig.show()
除了精细地修改Figure属性的话,我们想改变Figure样貌的更加快捷的方式是换一个模板(template)
import plotly
print(plotly.io.templates)
fig.layout.template = "seaborn"
fig
`nginx
Templates configuration
Original: https://blog.csdn.net/Python_Ai_Road/article/details/123911570
Author: Python_Ai_Road
Title: Plotly深入浅出
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/695457/
转载文章受原作者版权保护。转载请注明原作者出处!