如何从两个CSV提取经纬度并dropna,用Plotly绘制带独立图例的可切换scatter_mapbox
解决方案
第一步:先把数据处理干净
用pandas读取两个CSV文件,只保留lat和long列,再删掉含缺失值的行:
import pandas as pd import plotly.graph_objects as go # 处理第一个数据集 df1 = pd.read_csv('你的第一个文件.csv') df1_clean = df1[['lat', 'long']].dropna() # 处理第二个数据集 df2 = pd.read_csv('你的第二个文件.csv') df2_clean = df2[['lat', 'long']].dropna()
第二步:在同一地图上绘制带独立图例的双散点层
别用fig.add_trace(fig2.data[0])这种直接搬移trace的方式,直接在同一个Figure里分别定义两个散点层,手动设置颜色和图例名称,就能实现颜色区分、独立图例,还能点击图例切换单个数据集的显示状态:
# 初始化空地图对象 fig = go.Figure() # 添加第一个数据集的散点,设置红色、自定义图例名 fig.add_trace(go.Scattermapbox( lat=df1_clean['lat'], lon=df1_clean['long'], mode='markers', marker=dict( size=8, color='#ff0000', # 支持十六进制/RGB颜色值 opacity=0.7 ), name='数据集1' )) # 添加第二个数据集的散点,设置蓝色、自定义图例名 fig.add_trace(go.Scattermapbox( lat=df2_clean['lat'], lon=df2_clean['long'], mode='markers', marker=dict( size=8, color='#0000ff', opacity=0.7 ), name='数据集2' )) # 配置地图样式与布局 fig.update_layout( mapbox_style='open-street-map', # 也可替换为'carto-positron'等其他地图样式 mapbox_center={'lat': (df1_clean['lat'].mean() + df2_clean['lat'].mean())/2, 'lon': (df1_clean['long'].mean() + df2_clean['long'].mean())/2}, mapbox_zoom=10, showlegend=True, legend=dict( yanchor="top", y=0.99, xanchor="left", x=0.01 ) ) fig.show()
为啥之前的方法会出现撞色+图例重复?
你之前直接把fig2.data[0]添加到主图,相当于完全复用了第二个Figure中trace的所有样式(包括颜色、名称),所以两个散点层视觉上完全一致,图例也只会显示一项。
如果习惯用Plotly Express生成单图,也可以这么调整:
import plotly.express as px # 用px生成第一个图,修改颜色和图例名 fig1 = px.scatter_mapbox(df1_clean, lat='lat', lon='long') fig1.data[0].marker.color = '#ff0000' fig1.data[0].name = '数据集1' # 用px生成第二个图,同样修改颜色和图例名 fig2 = px.scatter_mapbox(df2_clean, lat='lat', lon='long') fig2.data[0].marker.color = '#0000ff' fig2.data[0].name = '数据集2' # 合并两个trace到同一个Figure fig = go.Figure(data=fig1.data + fig2.data) fig.update_layout(mapbox_style='open-street-map', showlegend=True) fig.show()
内容的提问来源于stack exchange,提问作者Akanksha Patel
相关产品推荐
相关产品推荐

