You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly散点图数据点超量后标记轮廓线不显示,如何解决?

解决Plotly散点图大数据量下标记轮廓消失的问题

问题核心是Plotly的性能优化机制:当散点图的数据点数量超过默认阈值(2000个)时,Plotly会自动从SVG渲染模式切换到WebGL(scattergl)模式,而你自定义模板只配置了scatter类型的样式,WebGL模式对应的scattergl并没有继承这些轮廓设置,导致轮廓消失。

解决方案:同时为scatter和scattergl配置模板样式

修改你的模板定义,同时添加scattergl的样式配置,确保两种渲染模式下都能应用标记轮廓:

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

MARKERS = ['circle', 'cross', 'x', 'triangle-up', 'star', 'hexagram', 'square', 'diamond', 'hourglass', 'bowtie', 'pentagon', 'triangle-down', 'triangle-left', 'triangle-right', 'star-triangle-up', 'star-triangle-down', 'star-square', 'star-diamond', 'diamond-tall', 'diamond-wide', 'triangle-ne', 'triangle-se', 'triangle-sw', 'triangle-nw',  'hexagon', 'hexagon2', 'octagon']

my_template = pio.templates['plotly']
# 配置scatter的样式
my_template.data.scatter = [
    go.Scatter(
        marker = dict(
            symbol = s, 
            line = dict(width = .5)
        ), 
        error_y = dict(width = 1, thickness = .8)
    ) for s in MARKERS
]
# 新增scattergl的样式配置,和scatter保持一致
my_template.data.scattergl = [
    go.Scattergl(
        marker = dict(
            symbol = s, 
            line = dict(width = .5)
        ), 
        error_y = dict(width = 1, thickness = .8)
    ) for s in MARKERS
]

pio.templates['my_template'] = my_template
pio.templates.default = 'my_template'

N_SAMPLES = 9999 # 现在大数据量也能正常显示轮廓
fig = px.scatter(
    pd.DataFrame({
        'x': np.random.randn(N_SAMPLES),
        'y': np.random.exponential(size=N_SAMPLES),
    }),
    x = "x",  
    y = "y", 
)
fig.show()

其他可选方案

  1. 强制使用SVG渲染:如果数据量不是极大(比如几万以内),可以强制Plotly用SVG模式渲染,这样模板里的scatter配置会生效,但大数据量下可能出现性能卡顿:
    fig.show(renderer="svg")
    # 或者全局设置默认渲染器
    pio.renderers.default = "svg"
    
  2. 直接在绘图时指定渲染模式和样式:跳过模板,直接在px.scatter中明确设置render_mode和标记样式,避免模板适配问题:
    fig = px.scatter(
        pd.DataFrame({...}),
        x="x", y="y",
        render_mode="webgl", # 明确用WebGL模式
        color_discrete_sequence=["#636EFA"],
        marker=dict(line=dict(width=0.5))
    )
    

内容的提问来源于stack exchange,提问作者user171780

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:35:18