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

Plotly Scatterpolar图表配色、图例及轨迹符号设置问题咨询

Plotly Scatterpolar图表配色、图例及轨迹符号设置问题咨询

嗨,我来帮你搞定这三个Plotly Scatterpolar的设置问题,结合你的数据和现有代码,咱们一步步调整解决:

1. 自定义轨迹的颜色刻度

因为你是想用SNR这个连续值来给每个卫星的轨迹上色,咱们可以先基于每个卫星的SNR统计值(比如均值),把SNR映射到你想要的色阶上。具体步骤如下:

首先导入plotly.colors模块,然后对数据按卫星PRN分组计算平均SNR,再把SNR值归一化后匹配到色阶颜色:

import pandas as pd
import plotly.graph_objects as go
import plotly.colors

data=r'C:\data\satellites.csv'
df = pd.read_csv(data)

fig1 = go.Figure()

# 按PRN分组计算每个卫星的平均SNR,用于颜色映射
prn_snr = df.groupby('PRN')['SNR'].mean().reset_index()
# 获取SNR的最大最小值,用于归一化
snr_min = prn_snr['SNR'].min()
snr_max = prn_snr['SNR'].max()
# 选择色阶,这里用默认的Viridis,也可以换成Plasma、RdYlBu或者自定义渐变
color_scale = plotly.colors.sequential.Viridis

然后在循环生成轨迹时,根据每个卫星的平均SNR获取对应颜色:

prn_list = df['PRN'].unique()
for prn in prn_list:
    prn_data = df[df['PRN'] == prn]
    # 获取当前卫星的平均SNR
    avg_snr = prn_snr[prn_snr['PRN'] == prn]['SNR'].values[0]
    # 归一化SNR到0-1的范围,方便匹配色阶
    norm_snr = (avg_snr - snr_min) / (snr_max - snr_min)
    # 从色阶中提取对应颜色
    trace_color = plotly.colors.sample_colorscale(color_scale, [norm_snr])[0]
    
    fig1.add_trace(go.Scatterpolar(
        r=prn_data['Elevation'],  # 仰角作为极坐标的半径(0-90,符合r轴范围)
        theta=prn_data['Azimuth'], # 方位角作为极角(0-360)
        name=prn,
        mode='lines+markers',
        line=dict(color=trace_color),
        marker=dict(color=trace_color)
    ))

2. 显示连续SNR刻度的图例

默认的离散图例不适合展示连续的SNR颜色映射,咱们可以添加一个隐藏的辅助轨迹,用它来生成连续的颜色条作为图例:

# 添加隐藏的辅助轨迹,用于生成SNR颜色条
fig1.add_trace(go.Scatter(
    x=[None], y=[None],  # 不显示实际数据点
    mode='markers',
    marker=dict(
        size=10,
        color=prn_snr['SNR'],  # 用卫星的平均SNR值生成颜色映射
        colorscale=color_scale,
        showscale=True,
        colorbar=dict(
            title='SNR',  # 颜色条标题
            ticks='outside',
            # 设置刻度值和显示文本,可根据你的SNR范围调整
            tickvals=[snr_min, (snr_min+snr_max)/2, snr_max],
            ticktext=[f'{snr_min}', f'{(snr_min+snr_max)/2:.1f}', f'{snr_max}']
        )
    ),
    hoverinfo='none',  # 隐藏hover提示
    showlegend=False   # 不显示在离散图例中
))

添加这个轨迹后,图表右侧就会出现一个对应SNR范围的连续颜色条,清晰展示颜色和SNR的对应关系。

3. 自动为每个卫星轨迹生成不同符号

Plotly支持多种标记符号,咱们可以定义一个符号列表,循环时按卫星索引分配符号(符号不够时自动循环):

首先定义符号列表,然后在循环中获取对应符号:

# 定义标记符号列表,Plotly支持的符号有circle、square、diamond、cross、x、triangle-up等,可按需扩展
symbols = ['circle', 'square', 'diamond', 'cross', 'x', 'triangle-up', 'triangle-down', 'star']

# 调整之前的循环,加入符号分配
for idx, prn in enumerate(prn_list):
    prn_data = df[df['PRN'] == prn]
    avg_snr = prn_snr[prn_snr['PRN'] == prn]['SNR'].values[0]
    norm_snr = (avg_snr - snr_min) / (snr_max - snr_min)
    trace_color = plotly.colors.sample_colorscale(color_scale, [norm_snr])[0]
    # 按索引取符号,超出列表长度时循环使用
    marker_symbol = symbols[idx % len(symbols)]
    
    fig1.add_trace(go.Scatterpolar(
        r=prn_data['Elevation'],
        theta=prn_data['Azimuth'],
        name=prn,
        mode='lines+markers',
        line=dict(color=trace_color),
        marker=dict(color=trace_color, symbol=marker_symbol, size=8)
    ))

最后别忘了设置极坐标的布局,让图表更贴合你的数据:

# 设置极坐标布局
fig1.update_layout(
    polar=dict(
        radialaxis=dict(
            visible=True,
            range=[0, 90],  # 仰角范围0-90
            title='Elevation'
        ),
        angularaxis=dict(
            visible=True,
            title='Azimuth'
        )
    ),
    title='GPS Satellite Azimuth & Elevation (Colored by SNR)'
)

fig1.show()

把这些代码整合起来,就能得到一个颜色随SNR变化、带连续颜色条图例、每个卫星符号不同的Scatterpolar图表啦!

备注:内容来源于stack exchange,提问作者cappo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 13:34:38