在 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 中更改)。
我无法在 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 中更改)。