本文我们按照如下3 part来深入浅出地讲解plotly的使用方法。 喜欢记得收藏、关注、点赞
-
part1: 深入原理, 本文第一节和第二节,分别介绍 go和px 的设计思想和绘图原理。
-
part2: 浅出范例, 本文第三节和第四节,对比性地展示 go和px 的五种绘图范例(柱形图、折线图、散点图、热力图、直方图)
-
part3: 深入实践, 本文第五节,展示一些plotly和机器学习相结合的综合应用范例。
注:完整代码、资料、技术交流,文末提供
一,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
Templates configuration ----------------------- Default template: 'plotly' Available templates: ['ggplot2', 'seaborn', 'simple_w