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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:05:07