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

Streamlit中更新Plotly density_mapbox底图时如何保留视口状态

解决Streamlit切换Plotly地图底图时视口重置问题

实现思路

  • 用st.session_state持久化存储地图的缩放级别与中心点坐标
  • 监听Plotly图表的布局交互事件,用户平移、缩放地图时同步更新存储的视口参数
  • 每次重绘图表时优先读取存储的视口参数,替代固定默认值

完整修改后代码

import streamlit as st
import plotly.express as px
import pandas as pd

df = pd.DataFrame(
    data=(
        [
            [32.4087249155, -100.9509696428, "2013-01-01", 1],
            [31.5201976084, -102.1030942593, "2013-01-01", 1],
            [31.434573418, -102.0592907601, "2013-01-01", 1],
            [31.2635930582, -101.95341361, "2013-01-01", 1],
            [31.4287233847, -102.0253840388, "2013-01-01", 1],
            [31.4872286706, -101.5455598032, "2021-01-01", 1],
            [31.5439162579, -101.4833865708, "2021-01-01", 1],
            [31.5439362581, -101.4833065695, "2021-01-01", 1],
            [31.7980713977, -102.0937650441, "2021-01-01", 1],
            [32.02050082, -103.31736372, "2021-01-01", 1],
        ]
    ),
    columns=["Latitude", "Longitude", "Date", "Count"],
)

st.set_page_config(layout="wide")

# 初始化会话状态存储视口参数
if "map_zoom" not in st.session_state:
    st.session_state.map_zoom = 3
if "map_center" not in st.session_state:
    st.session_state.map_center = {"lat": df["Latitude"].mean(), "lon": df["Longitude"].mean()}

# 视口参数更新回调
def update_viewport(layout_data):
    if "mapbox.zoom" in layout_data:
        st.session_state.map_zoom = layout_data["mapbox.zoom"]
    if "mapbox.center" in layout_data:
        st.session_state.map_center = layout_data["mapbox.center"]

style = "carto-positron"
sat_view = st.checkbox("Dark view")
if sat_view:
    style = "carto-darkmatter"

fig = px.density_mapbox(
    df,
    lat="Latitude",
    lon="Longitude",
    z="Count",
    radius=10,
    # 复用存储的视口参数
    zoom=st.session_state.map_zoom,
    center=st.session_state.map_center
)
fig.update_layout(mapbox_style=style)

# 渲染图表时绑定回调事件
st.plotly_chart(fig, use_container_width=True, on_relayout=update_viewport)

说明

用户对地图做缩放、平移操作时,Plotly会触发relayout事件,回调函数会自动把最新的视口参数存入会话状态,点击复选框切换底图触发页面重渲染时,生成图表会直接读取之前存储的视口参数,不会重置到初始状态。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:27:02