Scattermapbox clickData回调在地图中取消选择项目时不触发



我在一个项目中使用Scattermapbox。在Scattermapbox中,可以启用选项'clickmode='event+select'。这使得通过使用clickData触发回调成为可能。不幸的是,我只在选择时得到回调,而在取消选择时没有。有解决办法吗?

可以通过回调实现

  • 图形状态响应clickData
  • 检查selectedpoints和适当的添加/删除

完整工作示例

import dash, json, io, requests
from jupyter_dash import JupyterDash
import plotly.graph_objects as go
import plotly.express as px
from dash.dependencies import Input, Output, State
import pandas as pd
import numpy as np
# get some public addressess - hospitals.  data that has GPS lat / lon
dfhos = pd.read_csv(
io.StringIO(
requests.get("http://media.nhschoices.nhs.uk/data/foi/Hospital.csv").text
),
sep="¬",
engine="python",
).loc[:, ["OrganisationName", "Latitude", "Longitude"]]
fig = px.scatter_mapbox(dfhos, lat="Latitude", lon="Longitude").update_layout(
mapbox={
"style": "open-street-map",
"zoom": 6,
},
margin={"l": 0, "r": 0, "t": 0, "r": 0},
).update_traces(selected={"marker":{"color":"red"}})
# create the dash app
# app = dash.Dash()
app = JupyterDash(__name__)
app.layout = dash.html.Div(
[
dash.dcc.Graph(id="map", figure=fig),
dash.html.Div(id="outDiv")
]
)
@app.callback(
Output("map","figure"),
[Input("map", "clickData")],
[State("map", "figure")]
)
def mapClick(clickData, fig):
fig = go.Figure(fig)
if clickData:
p = clickData["points"][0]["pointIndex"]
pa = fig.data[0]["selectedpoints"]
pa = tuple() if not pa else pa
if p in pa:
pa = [sp for sp in pa if sp!=p]
else:
pa = pa + (p,)

fig.data[0]["selectedpoints"] = pa

return fig
app.run_server(mode="inline")