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

 

posted @ 2022-06-14 09:05  Pyrokine  阅读(327)  评论(0编辑  收藏  举报