plotly.express scatter_geo多数据集绘制与子图创建问题咨询
Plotly scatter_geo 叠加图层与子图实现方案
Plotly Express 生成的是标准 Plotly Figure 对象,支持原生图层追加与子图布局,无需套用 matplotlib 的绘图逻辑,具体实现方法如下:
叠加地面站图层(不覆盖原有卫星数据)
直接在已生成的卫星图对象上追加 trace 即可,不要在原 px.scatter_geo 调用中传入 location 参数,避免覆盖原有数据映射。
- 先整理地面站坐标数据,替换为实际值即可:
import pandas as pd # 地面站示例数据 ground_stations = pd.DataFrame({ 'station_name': ['站点1', '站点2', '站点3'], 'latitude': [39.90, 18.25, 39.47], 'longitude': [116.40, 109.51, 75.99] })
- 调用
add_trace追加地面站图层,注意添加frame='all'配置,保证动画播放时地面站不会消失:
import plotly.graph_objects as go fig.add_trace( go.Scattergeo( lat=ground_stations['latitude'], lon=ground_stations['longitude'], mode='markers+text', marker=dict(size=14, color='#ff2d55', symbol='triangle-up'), text=ground_stations['station_name'], textposition='bottom right', name='地面观测站', frame='all' # 核心配置:静态图层在所有动画帧常驻 ) )
如果需要绘制地面站的观测覆盖范围,用同样方法追加go.Scattergeo绘制闭合经纬度轨迹即可。
创建多子图布局
子图需要通过plotly.subplots.make_subplots提前声明geo类型的子图槽位,再将px生成的卫星轨迹、自定义地面站轨迹分别分配到对应子图,示例代码:
from plotly.subplots import make_subplots # 初始化1行2列的子图,两个子图均为地理坐标类型 fig = make_subplots( rows=1, cols=2, specs=[[{"type": "scattergeo"}, {"type": "scattergeo"}]] ) # 生成原有的卫星动态轨迹图 sat_fig = px.scatter_geo( prop_data['2022-06-06':'2022-06-06'], animation_frame='hour', color='visible', lat='latitude', lon='longitude', opacity=0.3, hover_data=['elevation', 'azimuth'] ) # 将卫星轨迹和动画帧同步到子图 for trace in sat_fig.data: fig.add_trace(trace, row=1, col=1) fig.frames = sat_fig.frames fig.layout.update(sat_fig.layout) # 给两个子图都添加地面站图层 for col_idx in [1, 2]: fig.add_trace( go.Scattergeo( lat=ground_stations['latitude'], lon=ground_stations['longitude'], mode='markers', marker=dict(size=14, color='#ff2d55', symbol='triangle-up'), name='地面观测站', frame='all' ), row=1, col=col_idx ) # 分别配置两个子图的投影方式 fig.update_geos(projection_type="orthographic", row=1, col=1) fig.update_geos(projection_type="equirectangular", row=1, col=2) fig.show()
关键注意点
- 不要在同一个
px.scatter_geo调用中混合传入卫星与地面站数据,会打乱动画帧逻辑与颜色映射规则。 - 追加静态常驻图层必须配置
frame='all',否则动画播放时静态图层会被帧数据覆盖。 - 使用子图布局时,投影参数不要在px调用中设置,通过
update_geos针对每个子图单独配置即可。
原有代码运行生成的卫星轨迹效果:
内容的提问来源于stack exchange,提问作者jtmt2000
相关产品推荐
相关产品推荐

