在 Altair 中覆盖等值线的状态轮廓

Overlay state outlines on choropleth in Altair

我无法在 Altair 中将州轮廓覆盖在县级等值线上。
我正在使用 altair 的图层方法来实现这一点。
但是,它采用州轮廓图的笔触颜色并使用该颜色绘制县轮廓。

这是我的代码:

import altair as alt
from vega_datasets import data

us_states = alt.topo_feature(data.us_10m.url, 'states')
us_counties = alt.topo_feature(data.us_10m.url, 'counties')
unemp_data = data.unemployment(sep='\t')
unemp_data.head()

plot = alt.Chart(us_counties).mark_geoshape(stroke='white').project(
type='albersUsa'
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(unemp_data, 'id', ['rate'])
).encode(
    color='rate:Q'
).properties(
    width=700,
    height=400
)

outline = alt.Chart(us_states).mark_geoshape( stroke='black').project(
    type='albersUsa'
).properties(
    width=700,
    height=400
)

alt.layer(plot,outline)

我得到以下结果: Layered Plot

这看起来是 Vega 中的一个错误,其中如果两个数据源相同,笔画属性会相互覆盖。我设法通过在其中一个 URL 的末尾添加一个 "#" 来解决这个问题,以诱使 Vega 认为数据集不同:

import altair as alt
from vega_datasets import data

us_states = alt.topo_feature(data.us_10m.url, 'states')
us_counties = alt.topo_feature(data.us_10m.url+"#", 'counties')
unemp_data = data.unemployment.url

plot = alt.Chart(us_counties).mark_geoshape(stroke='white').project(
type='albersUsa'
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(unemp_data, 'id', ['rate'])
).encode(
    color='rate:Q'
).properties(
    width=700,
    height=400
)

outline = alt.Chart(us_states).mark_geoshape(stroke='black', fillOpacity=0).project(
    type='albersUsa'
).properties(
    width=700,
    height=400
)

alt.layer(plot,outline)

(另外,我指定了 fillOpacity=0 因为此默认值将在 Vega-Lite 4 中更改)。