python3 plotly库笔记
导入库
from plotly import subplots
import plotly.offilne as offline
import plotly.express as px
import plotly.graph_objs as go
plotly主要有两个用法,graph_objs相对基础一些,express是一个高级的封装,支持更多便捷的操作,也支持对pandas的dataframe操作,为了快捷实现可视化功能可以直接使用express
测试数据
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
z = [0, 1, 8, 27, 64, 125]
c = [0, 0, 1, 2, 3, 4]
graph_objs
画图框架
trace = go.Scatter(...)
data = [trace]
layout = go.Layout(...)
fig = go.Figure(
data=data,
layout=layout
)
绘制图片
在jupyter中使用
方法1:fig.show()
方法2:offline.iplot(fig)
生成网页
方法1:offline.plot(fig)
多个轨迹叠加在同一张图上
# 方法1,Figure里面可以加data也可以留空,然后底下每多一个图用一次add_trace
go.Figure()
go.add_trace(go.Scatter(...))
go.add_trace(go.Histogram(...))
# 方法2,data数组里面新增图表
data = [
go.Scatter(...),
go.Histogram(...),
...
]
多个轨迹在同一张图上但不叠加
# 方法1,使用subplots
fig = subplots.make_subplots(rows=2, cols=1)
fig.append_trace(trace1, 1, 1) # append和add都可以
fig.add_trace(trace2, 2, 1)
绘制二维散点图/折线图
trace1 = go.Scatter(
x=x, # 横轴数据
y=y, # 纵轴数据
mode='markers+lines', # markers和lines自由组合,用+连接
name='trace1', # 多个轨迹在同一个图里时会生效
marker=dict(
color=c, # marker的颜色
opacity=[1, 0.9, 0.8, 0.7, 0.6, 0.5], # marker的透明度
size=[40, 60, 80, 100, 120, 140], # marker的大小
cmin=0, # 颜色的最小值,低于最小值的用最小值上色
cmax=3, # 颜色的最大值,高于最大值的用最大值上色
colorscale='ylorrd', # marker自动上色的范围
showscale=True, # 颜色的图例,默认是True
colorbar=dict(
x=-0.18, # 设置图例位置,为相对网格坐标的比例
dtick=1, # 坐标间隔
)
),
)
trace2 = go.Scatter(
y=z, # x可以省略
mode='markers',
name='trace2',
xaxis='x1', # 默认是axis1,x即x1,y即x1,xaxis2为x2,xaxis3为x3,以此类推
yaxis='y3', # 使用yaxis3,在layout里面定义
marker=dict(
color=c,
colorbar=dict(
x=1.1,
dtick=0.2,
)
)
)
trace2.marker.colorscale = 'viridis' # 第二种设置参数的方式
trace2.update(marker_reversescale=True) # 第三种设置参数的方式,设置颜色反转
data=[
trace1, trace2
]
layout = go.Layout(
title='title',
xaxis=dict( # 第一个x轴,xaxis1可简写为xaxis
title='xaxis_title', # x轴标题
dtick=2, # x轴间隔
range=(0, 8) # x轴范围
),
yaxis1=dict( # 第一个y轴,yaxis1可简写为yaxis
title='yaxis_title', # y轴标题
dtick=7, # y轴间隔
color='#0000FF', # y轴文字颜色
gridcolor='rgb(0, 0, 255)' # y轴网格颜色
),
xaxis2=dict( # 第二个x轴
title='xaxis2_title', # 第二个x轴的标题
overlaying='x', # 如果不加这行若有多个x轴将只显示其中一个的网格
side='top' # 方位有top, bottom, left, right
),
yaxis3={ # 第二个y轴,下面演示的是另一种字典的写法
'title': 'yaxis2_title',
'overlaying': 'y',
'side': 'right',
'dtick': 30,
'color': 'red',
'gridcolor': 'red'
},
legend=dict( # 图例参数
title=dict(
text='legend',
font=dict(
size=12,
color='black',
),
),
bgcolor='white', # 图例背景色
x=1, # 图例横坐标位置
y=1.3, # 图例纵坐标位置
font=dict(
size=12, # 图例字体大小
color='black' # 图例字体颜色
)
),
)
fig = go.Figure(
data=data,
layout=layout
)
fig.show()
绘制二维直方图和条形图
trace1 = go.Bar(
x=x,
y=y,
)
trace2 = go.Histogram(
x=c,
xbins = dict(
start=0, # 数据范围
end=4, # 范围均是左闭右开
size=5 # 相邻坐标合并的数量
),
opacity=0.5, # 柱状图的透明度设置
)
trace3 = go.Histogram(
x=y,
xbins = dict(
start=0, # 如果有多图叠加的情况下,需要都加上范围,要不然可能会坐标不对齐
end=26, # 可以设为max(list) + 1
size=1, # 存在多个直方图时如果barmode是overlay,则size分别生效,其他模式则以第一个轨迹的size为准
),
opacity=0.5,
)
trace4 = go.Bar(
x=x,
y=y,
orientation='h' # h为horizontal,v为vertical
)
fig = subplots.make_subplots(rows=2, cols=2) # 两行两列共四个子图
fig.append_trace(trace1, 1, 1) # append和add都可以
fig.add_trace(trace2, 1, 2) # 子图序号为从左到右后从上到下计数,如果放在1行2列则为2,2行1列则为3,layout中需修改对应的坐标轴序号
fig.add_trace(trace3, 1, 2) # 可以叠加多个轨迹到一个子图上
fig.add_trace(trace4, 2, 2) # 2行2列即为4,中间可以跳过3
layout = go.Layout(
title='title',
xaxis=dict(
title='xaxis1_title',
domain=[0, 0.45] # 零点在左下角
),
yaxis=dict(
title='yaxis1_title',
domain=[0.6, 1]
),
xaxis2=dict(
title='xaxis2_title',
domain=[0, 1]
),
yaxis2=dict(
title='yaxis2_title',
domain=[0, 0.5] # 子图实际位置是可以随意设置的
),
xaxis4=dict(
title='xaxis4_title',
domain=[0.55, 1]
),
yaxis4=dict(
title='yaxis4_title',
domain=[0.6, 1]
),
barmode='overlay', # 不设置默认是group,可以设置为stack、overlay、group和relative,目前仅能进行全局设置
width=800,
height=1000,
)
fig.update_layout(layout)
fig.show()
绘制其他图诸如饼图热力图等等均是类似的,具体参数设置参考官方文档即可
express
未完待续...
感谢
plotly document
https://plotly.com/python-api-reference/
可视化神器Plotly_Express详解
https://www.jianshu.com/p/41735ecd3f75?utm_campaign=hugo
plotly笔记
https://www.cxyzjd.com/article/weixin_44390462/105462576