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

如何在Altair/Vega-Lite中拼接带独立坐标轴的地理形状图表?

问题:拼接地理形状图表时保持各自的自动缩放范围

我尝试绘制两个独立的地理形状图表并将它们拼接在一起,以下是最小可复现示例(MWE):

import altair as alt
from vega_datasets import data
import geopandas as gpd

source = data.us_10m

source = gpd.read_file(source.url).set_crs(epsg=4326)

r1 = alt.Chart(source).mark_geoshape().transform_filter(alt.datum.id == '49047')
r2 = alt.Chart(source).mark_geoshape().transform_filter(alt.datum.id == '20123')

r1 | r2

单独绘制每个图表时,Altair会自动将形状缩放至其范围,效果良好。但拼接后,两个图表共享坐标轴范围,每个图表的视图都会扩展到能显示两个区域的大小。我预期让两个图表保持各自的自动缩放范围并排显示,尝试设置resolve_axis(x='independent', y='independent')但无效果,同时也接受不使用Altair抽象的Vega-Lite解决方案。

解决方案

地理图表的缩放由**投影(projection)**控制,而非普通坐标轴,因此resolve_axis不会生效。要实现每个子图独立缩放,可通过以下两种方式:

方法1:为每个图表指定独立的自适应投影

为每个Chart显式设置投影,并利用fit参数让投影自动适配过滤后的地理数据:

import altair as alt
from vega_datasets import data
import geopandas as gpd

source = data.us_10m
source = gpd.read_file(source.url).set_crs(epsg=4326)

r1 = alt.Chart(source).mark_geoshape().transform_filter(
    alt.datum.id == '49047'
).project(type='mercator', fit=alt.FitParams())

r2 = alt.Chart(source).mark_geoshape().transform_filter(
    alt.datum.id == '20123'
).project(type='mercator', fit=alt.FitParams())

r1 | r2

方法2:使用resolve_scale让投影参数独立

在拼接后的组合图表上设置resolve_scale(projection='independent'),让每个子图基于自身数据计算投影范围:

import altair as alt
from vega_datasets import data
import geopandas as gpd

source = data.us_10m
source = gpd.read_file(source.url).set_crs(epsg=4326)

r1 = alt.Chart(source).mark_geoshape().transform_filter(alt.datum.id == '49047')
r2 = alt.Chart(source).mark_geoshape().transform_filter(alt.datum.id == '20123')

(r1 | r2).resolve_scale(projection='independent')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:56:16