基于Altair实现机场关联交互式时序可视化改造请求
改造Altair机场可视化:添加年份滑块与自定义气泡大小
我来帮你搞定这个需求!结合你的数据结构和要求,我调整了原画廊示例的代码,实现了年份滑块交互,并且把气泡大小绑定到你的size字段上。下面是完整代码和关键细节说明:
完整实现代码
import altair as alt from vega_datasets import data import pandas as pd # 加载你的数据(这里模拟你的DataFrame结构,实际替换成你的数据加载逻辑即可) df = pd.DataFrame([ ["RKPC", 1.00, 126.49, 33.51, 2017], ["RKSS", 0.88, 126.79, 37.55, 2017], ["ZGSZ", 0.43, 113.81, 22.63, 2017], ["RJTT", 0.43, 139.77, 35.55, 2017], ["VHHH", 0.38, 113.91, 22.30, 2017], ["YBLA", 0.76, 146.00, -36.55, 2018], ["YCOM", 0.52, 148.97, -36.30, 2018], ["YPCC", 0.22, 96.83, -12.18, 2018], ["YWGT", 0.12, 146.30, -36.41, 2018], ["ZBNY", 0.03, 116.38, 39.78, 2018] ], columns=["icao", "size", "longitude", "latitude", "year"]) # 获取美国地图拓扑数据(如果你的机场不限于美国,可替换为全球投影) states = alt.topo_feature(data.us_10m.url, feature="states") # 创建年份滑块选择器 year_slider = alt.selection_single( name="选择年份", fields=["year"], init={"year": df["year"].min()}, # 默认选中数据中的最早年份 bind=alt.binding_range( min=df["year"].min(), max=df["year"].max(), step=1, label="年份:" ) ) # 背景地图层 background = alt.Chart(states).mark_geoshape( fill="#f0f0f0", stroke="#ffffff" ).properties( width=750, height=500 ).project("albersUsa") # 美国专属投影,全球展示可改用"equirectangular" # 机场气泡图层 airport_bubbles = alt.Chart(df).mark_circle( opacity=0.8, color="#2196F3" ).encode( latitude="latitude:Q", longitude="longitude:Q", # 绑定自定义size字段到气泡大小,可按需调整缩放范围 size=alt.Size( "size:Q", scale=alt.Scale(range=[20, 1200]), title="机场规模" ), # 自定义悬浮提示信息 tooltip=[ alt.Tooltip("icao:N", title="ICAO代码"), alt.Tooltip("size:Q", title="规模", format=".2f"), alt.Tooltip("year:Q", title="统计年份") ] ).add_selection( year_slider ).transform_filter( year_slider # 根据滑块选择实时过滤对应年份的数据 ) # 组合所有图层并展示 final_chart = (background + airport_bubbles).configure_view(stroke=None) final_chart.show()
关键调整说明
年份交互滑块:
- 用
alt.selection_single配合bind=alt.binding_range创建了可拖动的年份滑块,自动适配你数据中的年份范围 - 通过
transform_filter(year_slider)实现数据实时过滤,切换年份时气泡会自动更新
- 用
气泡大小自定义:
- 直接将你的
size字段映射到size编码,替换了原示例中基于航线数量的聚合计算 - 通过
alt.Scale(range=[20, 1200])调整气泡大小范围,你可以根据实际数据分布修改这个区间
- 直接将你的
数据源适配:
- 直接使用你的DataFrame字段(
icao、size、经纬度、year),不需要原示例中的lookup关联逻辑 - 保留了地图背景,若需全球范围展示,可把投影从
albersUsa改成equirectangular
- 直接使用你的DataFrame字段(
如果你的数据中还包含机场间的连接关系(比如航线数据),想要保留原示例中的关联线效果,随时告诉我你的连接数据结构,我再帮你补充这部分逻辑~
内容的提问来源于stack exchange,提问作者Red Shepard
相关产品推荐
相关产品推荐

