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

如何在Plotly雷达图中添加jitter抖动并正确叠加多轨迹图层

Plotly极坐标雷达图叠加抖动散点方案

问题根因

之前出现坐标轴错位,核心原因是散点轨迹单独配置了theta0和dtheta参数,这套自动角度递推逻辑和填充雷达层手动指定分类角度的映射规则冲突,两套坐标计算逻辑同时加载就会出现分类轴、数值轴混合错乱的问题。

具体实现方法

1. 散点jitter效果的正确实现

不要通过修改theta0/dtheta实现抖动,所有轨迹必须共用同一套分类到基准角度的映射规则:

  • 先给6个分类维度分配固定的基准角度(6个维度均分360度即可,比如[0,60,120,180,240,300])
  • 散点的角度值直接在对应分类的基准角度上,叠加小范围随机偏移,偏移幅度控制在±2~5度即可,既可以避免同维度散点重叠,也不会让散点偏离对应分类轴太远
  • 注意Plotly极坐标默认使用角度制,不要给过大的偏移量

jitter生成示例代码:

import numpy as np
# 6个分类对应的基准角度,和雷达层使用的theta参数完全一致
base_theta = [0, 60, 120, 180, 240, 300]
jitter_range = 3 # 抖动幅度,单位:度,可按需调整
other_sample_num = 6 # 其余待展示的样本数量

# 生成散点的r值
other_r = np.random.rand(len(dimension_labels)*other_sample_num) * 100
# 生成带抖动的theta值
other_theta = []
for _ in range(other_sample_num):
    for angle in base_theta:
        # 每个点叠加-3~+3度的随机偏移
        other_theta.append(angle + np.random.uniform(-jitter_range, jitter_range))

2. 两层轨迹叠加的正确写法

核心规则:所有go.Scatterpolar轨迹不要单独配置会修改坐标轴映射的参数,极轴属性统一在layout中全局配置,保证两层共用同一套坐标系。
完整可运行参考代码:

import plotly.graph_objects as go
import numpy as np

# 基础配置
dimension_labels = ['维度A','维度B','维度C','维度D','维度E','维度F']
base_theta = [0, 60, 120, 180, 240, 300]
target_sample_r = [82, 76, 90, 68, 85, 79] # 单样本雷达图的数值

fig = go.Figure()
# 第一层:填充样式单样本雷达图
fig.add_trace(go.Scatterpolar(
    r=target_sample_r,
    theta=base_theta,
    fill='toself',
    name='目标样本',
    line=dict(color='#2563eb', width=2),
    marker=dict(size=5)
))

# 第二层:带抖动的其余样本散点
other_sample_num = 6
other_r = np.random.rand(len(dimension_labels)*other_sample_num) * 100
jitter_range = 3
other_theta = []
for _ in range(other_sample_num):
    for angle in base_theta:
        other_theta.append(angle + np.random.uniform(-jitter_range, jitter_range))

fig.add_trace(go.Scatterpolar(
    mode='markers',
    r=other_r,
    theta=other_theta,
    name='其余样本',
    marker=dict(color='#f97316', size=7, opacity=0.6),
    line=None
))

# 全局统一配置极轴,所有轨迹共用
fig.update_layout(
    polar=dict(
        radialaxis=dict(
            visible=True,
            range=[0, 100]
        ),
        angularaxis=dict(
            tickvals=base_theta,
            ticktext=dimension_labels, # 角度轴显示分类标签而非角度数值
            direction='clockwise', # 可选:改为顺时针排列,符合常规雷达图阅读习惯
            rotation=90 # 可选:将第一个维度旋转到顶部位置
        )
    ),
    showlegend=True
)

fig.show()

避坑要点

  • 禁止在散点trace中设置theta0、dtheta参数,这两个参数会启用自动角度递推逻辑,和手动指定theta的雷达层必然冲突
  • 仅在角度维度加抖动即可,径向(r值)不要加随机偏移,否则会扭曲样本的真实数值;如果径向存在散点重叠,通过调整marker透明度解决即可
  • 不要给散点层单独配置polar子图,默认所有Scatterpolar轨迹共用第一个极坐标系,额外指定子图会导致坐标不互通

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:45:39