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

如何使用Dash实现地图的前后对比滑块?

无需自行开发组件:用Dash现有功能实现地图前后对比滑块

不需要自己造组件,用Dash自带的dcc.Slider配合回调函数,再结合Plotly图表的图层控制,就能轻松实现地图的前后对比效果。下面两种常见实现方式供你参考:

方式1:滑块控制对比图层透明度(渐变过渡)

这种方式是将两张地图叠加,通过滑块调整上层地图的透明度,实现从基准状态到目标状态的平滑过渡:

import dash
from dash import dcc, html, Input, Output
import plotly.express as px

# 示例数据(可替换为你的地理数据)
df = px.data.gapminder()
base_year = df['year'].min()  # 基准年份
max_year = df['year'].max()   # 对比年份上限

app = dash.Dash(__name__)

app.layout = html.Div([
    html.H3("地图前后对比(透明度控制)"),
    dcc.Slider(
        id='opacity-slider',
        min=0,
        max=100,
        value=50,
        marks={0: '仅基准', 50: '半透明叠加', 100: '仅对比'},
        tooltip={"placement": "bottom", "always_visible": True}
    ),
    dcc.Graph(id='comparison-map')
])

@app.callback(
    Output('comparison-map', 'figure'),
    Input('opacity-slider', 'value')
)
def update_map(opacity_value):
    # 生成基准地图
    fig = px.choropleth(
        df[df['year'] == base_year],
        locations='iso_alpha',
        color='lifeExp',
        hover_name='country',
        color_continuous_scale=px.colors.sequential.Plasma,
        title=f'预期寿命对比:{base_year} → 目标年份'
    )
    # 生成对比地图并添加为图层
    comparison_trace = px.choropleth(
        df[df['year'] == max_year],
        locations='iso_alpha',
        color='lifeExp',
        hover_name='country',
        color_continuous_scale=px.colors.sequential.Plasma
    ).data[0]
    # 根据滑块值设置对比图层透明度
    comparison_trace.opacity = opacity_value / 100
    fig.add_trace(comparison_trace)
    
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

方式2:滑块切换对比年份(直接切换显示)

如果需要明确对比两个不同时间点的地图,也可以用滑块选择目标年份,同时展示基准年份和目标年份的地图状态:

import dash
from dash import dcc, html, Input, Output
import plotly.express as px

df = px.data.gapminder()
base_year = df['year'].min()

app = dash.Dash(__name__)

app.layout = html.Div([
    html.H3("地图年份对比(直接切换)"),
    dcc.Slider(
        id='year-slider',
        min=df['year'].min(),
        max=df['year'].max(),
        value=df['year'].max(),
        marks={str(year): str(year) for year in df['year'].unique()},
        step=None
    ),
    dcc.Graph(id='year-comparison-map')
])

@app.callback(
    Output('year-comparison-map', 'figure'),
    Input('year-slider', 'value')
)
def update_year_map(selected_year):
    fig = px.choropleth(
        df,
        locations='iso_alpha',
        color='lifeExp',
        hover_name='country',
        animation_frame='year',
        range_color=[df['lifeExp'].min(), df['lifeExp'].max()],
        color_continuous_scale=px.colors.sequential.Plasma,
        title=f'预期寿命:{base_year} vs {selected_year}'
    )
    # 关闭动画过渡,直接跳转到选中年份
    fig.layout.updatemenus[0].buttons[0].args[1]["frame"]["duration"] = 0
    fig.layout.updatemenus[0].buttons[0].args[1]["transition"]["duration"] = 0
    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

两种方式都只用到Dash官方组件,完全不需要自行开发新组件。你可以根据需求调整,替换成自己的地理数据和对比维度即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:50:45