在 Altair 中过滤到状态级别的 Choropleth 地图
Filtering to State Level for Choropleth Maps in Altair
我一直在使用 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 data 来创建州界和县界。我使用 "states" 投影佐治亚州,然后我使用 "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
该代码似乎只提供完整的美国县地图。
有点奇怪的方式。
县 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
我一直在使用 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 data 来创建州界和县界。我使用 "states" 投影佐治亚州,然后我使用 "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
该代码似乎只提供完整的美国县地图。
有点奇怪的方式。
县 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