plotly 改变标记(marker)和直线(line)的风格

标记(markers)和直线(lines)的风格

import plotly.io as pio
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np

# 设置plotly默认主题
pio.templates.default = 'plotly_white'

# 设置pandas打印时显示所有列
pd.set_option('display.max_columns', None)

样式汇总

官方示例:https://plotly.com/python/marker-style/

参数说明:https://plotly.com/python/reference/scatter/

go.Scatter、fig.update_traces(marker=dict(…), selector=dict(type=‘scatter’))、fig.update_shapes

  • line:直线样式设置。字典类型,可取属性如下:
    • color:直线的颜色
    • dash:直线的样式
      • 可取样式字符串 'solid'(默认值)、 'dot''dash''longdash''dashdot''longdashdot' 或一个字符串长度列表,例如:“5px,10px,2px,2px”,即:绘画5px的短线,空10px,画2px短线,空2px
    • shape:确定直线的形状。取 'spline' 时,直线使用样条插值方式绘制,其他值对应于分段式的线型
      • 可取 'linear'(默认值)、 'spline''hv''vh''hvh''vhv'
    • simplify:是否通过移除相邻近似的点来简化线条。在过度线(transitioning lines)时,可能需要禁用此功能,这样产生的SVG路径上的点的数量就不会受到影响
    • smoothing:仅仅当 shape='spline'时有效,设置平滑程度。0表示无平滑(等价于 shape='linear'
      • [0, 1.3] 之间的浮点数,默认值为 1
    • width:设置线条宽度
      • 大于等于0的整数,默认值为2
fig = go.Figure()

line_dash = ['solid', 'dot', 'dash', 'longdash', 'dashdot', 'longdashdot']
for i, d in enumerate(line_dash):
    fig.add_trace(
        go.Scatter(
            x=[0, 10], y=[i, i], mode='lines', 
            line=dict(dash=d, width=3,),
            showlegend=False
    ))


fig.update_layout(
    width=600, height=500,
    yaxis=dict(
        type='category',
        tickvals=list(range(len(line_dash))),
        ticktext=line_dash,
        showgrid=False
    ),
    xaxis_showticklabels=False,
    xaxis_showgrid=False,
)

fig.write_image('../pic/lines_1.png', scale=10)
fig.show()

在这里插入图片描述

fig = go.Figure()

line_dash = ['5px,10px,3px,2px', 
             '10px,10px,5px,5px,3px',
             '30px',
             '30px,10px']
for i, d in enumerate(line_dash):
    fig.add_trace(
        go.Scatter(
            x=[0, 10], y=[i, i], mode='lines', 
            line_dash=d,
            showlegend=False
    ))


fig.update_layout(
    width=600, height=500,
    yaxis=dict(
        type='category',
        tickvals=list(range(len(line_dash))),
        ticktext=line_dash,
        showgrid=False
    ),
    xaxis_showticklabels=False,
    xaxis_showgrid=False,
)

fig.write_image('../pic/lines_2.png', scale=10)
fig.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihthqqbL-1644748324889)(./pic/lines_2.png)]

  • marker
    • symbol:设置标记的类型,末尾追加 100 等价于追加 “-open”, 追加 200 等价于追加 “-dot”,追加 300 等价于追加 “-open-dot” 或 “dot-open”。详细取值请看下面的样例
    • size:设置标记大小,大于等于0的整数,默认值为6
    • opacity:设置标记的不透明度,[0, 1]之间的浮点数
    • color:设置标记的颜色。接受一个特定的颜色或者一个数字数组,数组中的数会根据数组中的最大值和最小值映射到色阶上,或者根据 cmincmax (如果设置了)映射到色阶上。
      • 注:如果传入列表,那么列表长度必须等于传入的数据长度。列表中不仅可以是数字,也可以是颜色,如果为数字,那么必须搭配色柱 colorscale 使用,如果是颜色,则不需要色柱。一般柱状图 bar 传入颜色,以设置每个柱子的颜色。
    • cauto:是否根据输入 color 列表的数字数据自动计算 cmincmax,只有 color 传入了数值型列表才有效。默认值为 True ,如果指定了 cmincmax,那么该属性会自动设置为 False
    • cmin:设置色阶的下界,只有 color 传入了数值型列表才有效。如果指定了该属性,那么 cmax 也必须指定
    • cmid:通过缩放 cmincmax 设置色阶的中点。只有 color 传入了数值型列表才有效。当 cautoFalse 时无效。
    • cmax:设置色阶的上界,只有 color 传入了数值型列表才有效。如果指定了该属性,那么 cmin 也必须指定
    • reversescale:是否逆序颜色映射,只有当 color 为数值型列表时有效,如果为 Truecmin 将代表数组中的最后一个颜色、cmax 将代表数组中的第一个颜色
    • colorscale:设置色阶,只有当 color 设置为数值型数组时才有效。colorscale 必须是一个包含将归一化的后的数映射到 rgb、rgba、hex、hsl、hsv 或命名颜色字符串的数组,最低需要包含0和1的映射情况,例如:[[0, 'rgb(0,0,255)'], [1, 'rgb(255,0,0)']]。可以使用 cmincmax 控制色阶的边界。此外,colorscale 也可以是下面的这些字符串:'Blackbody''Bluered''Blues''Cividis''Earth''Electric''Greens''Greys''Hot''Jet''Picnic''Portland''Rainbow''RdBu''Reds''Viridis''YlGnBu''YlOrRd'
    • showscale:是否显示色柱,只有当 color 设置为数字数组时才有效。
    • colorbar:色柱相关设置
    • gradient:渐变色,字典类型,可取属性如下:
      • color:设置最终渐变色,‘radial’ 为中心色,‘horizontal’ 为右侧,‘vertical’ 为底部。字符串或颜色数组
      • type:设置渐变色填充标记的类型
        • 字符串枚举类型,或者字符串枚举类型的列表。可取 'radial''horizontal''vertical''none'(默认值)
    • line:标记点的线条设置,字典类型,可取属性如下:
      • color:同marker的 color
      • cauto:同marker的 cauto
      • cmin:同marker的 cmin
      • cmid:同marker的 cmid
      • cmax:同marker的 cmax
      • colorscale:同marker的 colorscale
      • reversescale:同marker的 reversescale
      • width:设置线条的宽度,大于等于0的整数。
import plotly.graph_objects as go
from plotly.validators.scatter.marker import SymbolValidator

raw_symbols = SymbolValidator().values
namestems = []
namevariants = []
symbols = []
for i in range(0,len(raw_symbols),3):
    name = raw_symbols[i+2]
    symbols.append(raw_symbols[i])
    namestems.append(name.replace("-open", "").replace("-dot", ""))
    namevariants.append(name[len(namestems[-1]):])

fig = go.Figure(go.Scatter(mode="markers", x=namevariants, y=namestems, marker_symbol=symbols,
                           marker_line_color="midnightblue", marker_color="lightskyblue",
                           marker_line_width=2, marker_size=15,
                           hovertemplate="name: %{y}%{x}<br>number: %{marker.symbol}<extra></extra>"))
fig.update_layout(title="Mouse over symbols for name & number!",
                  xaxis_range=[-1,4], yaxis_range=[len(set(namestems)),-1],
                  margin=dict(b=0,r=0), xaxis_side="top", height=1400, width=400)
fig.show()

在这里插入图片描述

df = px.data.iris()
print(df.head(3))

fig = px.scatter(df, x='sepal_width', y='petal_width')

fig.update_traces(
    marker=dict(
        color=[i for i in range(150)],
        colorscale='Electric',
        showscale=True,
        symbol='x-open-dot',
    )
)

fig.write_image('../pic/markers_2.png', scale=2)
fig.show()

在这里插入图片描述

df = px.data.iris()
print(df.head(3))

fig = px.scatter(df, x='sepal_width', y='petal_width')

fig.update_traces(
    marker=dict(
        color=[i for i in range(150)],
        cmin=50, cmax=100,
        colorscale=[[0, '#0d47a1'], [0.5, '#e3f2fd'], [1, '#d50000']],
        showscale=True,
        symbol='x-open-dot',
    )
)

fig.write_image('../pic/markers_3.png', scale=2)
fig.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RIa5SBWx-1644748324890)(./pic/markers_3.png)]

fig = px.bar(x=['a', 'b', 'c', 'd'], y=[6, 4 ,8, 3])

fig.update_traces(
    marker=dict(
        color=['#e57373', '#9575cd', '#4fc3f7', '#81c784']
    )
)

fig.update_layout(
    width=600, height=400
)

fig.write_image('../pic/markers_4.png', scale=2)
fig.show()

在这里插入图片描述

fig = px.bar(x=['a', 'b', 'c', 'd'], y=[6, 4 ,8, 3])

fig.update_traces(
    marker=dict(
        color=['#e57373', '#9575cd', '#4fc3f7', '#81c784'],
        line=dict(width=2, color='black')
    )
)

fig.update_layout(
    width=600, height=400
)

fig.write_image('../pic/markers_5.png', scale=2)
fig.show()

在这里插入图片描述

fig = go.Figure()

fig.add_trace(
    go.Scatter(
        x=list(range(10)), y=[2 for _ in range(10)], mode='markers',
        marker=dict(
            size=30, 
            gradient={'color': '#f0acf7', 'type': 'horizontal'},
            line_width=0,
        )
    )
)

fig.add_trace(
    go.Scatter(
        x=list(range(10)), y=[3 for _ in range(10)], mode='markers',
        marker=dict(
            size=30,
            color='rgba(0, 0, 0, 0)',  # 使用a属性将填充颜色设为透明
            line=dict(
                width=2,
                color=list(range(10)),
                colorscale=[[0, '#f7f0ac'], [0.5, '#acf7f0'], [1, '#f0acf7']],
            )
        )
    )
)

fig.write_image('../pic/markers_6.png', scale=2)
fig.show()

在这里插入图片描述

fig = px.bar(x=['a', 'b', 'c', 'd', 'e', 'f', 'g'], y=[6, 4 ,8, 3, 9, 6, 2])

# 使用 color=list(range(...)) 搭配 colorscale,可以实现渐变色的效果
fig.update_traces(
    marker=dict(
        color=list(range(7)),
        colorscale=[[0, '#f7f0ac'], [0.5, '#acf7f0'], [1, '#f0acf7']],
    )
)

fig.update_layout(
    width=600, height=400
)

# fig.write_image('../pic/markers_7.png', scale=2)
fig.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ionTinNI-1644748324892)(./pic/markers_7.png)]

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值