Plotly深入浅出

作为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()

Plotly深入浅出

如果要把图表的颜色改成红色实线怎么办呢?很简单,我们先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深入浅出

怎么样,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()

Plotly深入浅出
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深入浅出

二,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深入浅出

可以看到,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()

Plotly深入浅出

除了精细地修改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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球