首页 > 解决方案 > 在 Altair 中过滤到州级的 Choropleth 地图

问题描述

我一直在玩 Altair 的地图功能。我现在可以很容易地构建带有州和县边界的美国地图。我坚持的是将地图过滤到较低的水平。例如,如果我想制作一张只有乔治亚州和县边界的地图,我该怎么做?

我有一个解决方案,但这是一个糟糕的解决方案。好奇有没有更好的办法。这是我的代码:

states_data = alt.topo_feature(data.us_10m.url, "states")
counties = alt.topo_feature(data.us_10m.url, 'counties')

states = alt.Chart(states_data).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13))

cobb = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13067))

fulton = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13121))

dekalb = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13089))

states + cobb + fulton + dekalb

这段代码给了我这个结果:

在此处输入图像描述

我正在使用非常常见的Albers USA 数据来创建州界和县界。我使用“州”来投影乔治亚州,然后我使用“cobb”、“fulton”和“dekalb”来投影 3 个不同的亚特兰大都会区县。

这行得通,但效率极低,对全州所有 159 个县来说,这样做会很痛苦。有没有比我使用的更简单的方法来过滤县?或者是一种无需 1,000 多行代码即可读取所有 159 个县的良好自动化方式!?

编辑:另外为了记录,我试着做县,然后按州过滤,但这没有用。代码如下:

states = alt.Chart(states_data).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).transform_filter((alt.datum.id == 13))

counties = alt.Chart(counties).mark_geoshape(
        stroke='black',
        strokeWidth=1
    ).project('albersUsa')

states + counties

该代码似乎只是做完整的美国县地图。

在此处输入图像描述

标签: pythongischoroplethvega-litealtair

解决方案


有点奇怪的方式。

县 ID 代码以州 ID 开头。使用简单的 js 技巧,您可以提取它。

counties = alt.topo_feature(data.us_10m.url, 'counties')

map_georgia =(
    alt.Chart(data = counties)
    .mark_geoshape(
        stroke='black',
        strokeWidth=1
    )
    .transform_calculate(state_id = "(datum.id / 1000)|0")
    .transform_filter((alt.datum.state_id)==13)
)

map_georgia
    

在此处输入图像描述


推荐阅读