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
相关产品推荐
相关产品推荐

