如何为Plotly scattermapbox设置离散符号映射?
问题
能否为Plotly scattermapbox设置离散符号映射?已知可通过color和color_discrete_map分配颜色,是否能用类似方式通过离散映射指定特定符号?
希望将symbol_dict分配给species字段的唯一值,px.scattermapbox或go.scattermapbox均可。目前第二种实现方式无报错但不显示任何点,相关代码如下:
import plotly.express as px import pandas as pd df = px.data.iris() symbol_dict = {'versicolor': 'star', 'setosa': 'circle', 'virginica': 'diamond'} smap = df["species"].map(symbol_dict)
尝试的代码1:
fig = px.scatter_mapbox( df, lat="sepal_width", lon="sepal_length", #symbol="species", # set symbol to species #symbol_map=symbol_dict, # set symbol to species )
尝试的代码2:
fig = go.Figure(go.Scattermapbox( lat=df['sepal_width'], lon=df['sepal_length'], mode='markers', marker=dict(symbol = smap) ) ) fig.update_layout(mapbox_style = "carto-positron") fig.update_mapboxes(zoom = 5) fig.show()
解决方案
方法一:Plotly Express 实现离散符号映射
Plotly Express的px.scatter_mapbox完全支持类似颜色映射的符号配置逻辑:用symbol指定分类字段,symbol_map自定义符号与分类值的对应关系。注意使用Plotly支持的Mapbox符号名称(常用的有circle、star、diamond、square等)。
完整代码:
import plotly.express as px import pandas as pd df = px.data.iris() symbol_dict = {'versicolor': 'star', 'setosa': 'circle', 'virginica': 'diamond'} fig = px.scatter_mapbox( df, lat="sepal_width", lon="sepal_length", symbol="species", # 绑定分类字段 symbol_map=symbol_dict, # 设置符号映射 hover_name="species" ) # 适配非真实经纬度的坐标范围,调整地图中心和缩放 fig.update_layout( mapbox_style="carto-positron", mapbox=dict( center=dict(lat=df["sepal_width"].mean(), lon=df["sepal_length"].mean()), zoom=8 ) ) fig.show()
方法二:Graph Objects 实现离散符号映射
你之前的代码不显示点的核心原因是:用鸢尾花的花萼尺寸作为经纬度,数值范围极小,但设置的zoom=5会让地图范围过大,导致点被“淹没”。同时需要确保符号名称符合Plotly要求。
修正后的完整代码:
import plotly.graph_objects as go import pandas as pd import plotly.express as px df = px.data.iris() symbol_dict = {'versicolor': 'star', 'setosa': 'circle', 'virginica': 'diamond'} smap = df["species"].map(symbol_dict) fig = go.Figure(go.Scattermapbox( lat=df['sepal_width'], lon=df['sepal_length'], mode='markers', marker=dict( symbol=smap, size=10 # 增大点的尺寸,提升可见性 ), text=df['species'] # hover时显示物种名称 )) # 调整地图中心到数据平均值,放大缩放级别 fig.update_layout( mapbox_style="carto-positron", mapbox=dict( center=dict(lat=df["sepal_width"].mean(), lon=df["sepal_length"].mean()), zoom=8 ) ) fig.show()
内容的提问来源于stack exchange,提问作者Chopin
相关产品推荐
相关产品推荐

