Фильтрация на государственном уровне для карт Choropleth в Альтаире - PullRequest
3 голосов
/ 25 марта 2019

Я играл с картами Альтаира.Я очень легко могу создавать карты США с границами штатов и округов.То, на чем я застрял, - это фильтрация карт до более низкого уровня.Например, если бы я хотел построить карту только штата Джорджия с границами округа, как бы я это сделал?

У меня есть решение, но это плохое решение.Любопытно, есть ли лучший способ.Вот мой код:

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

Этот код дает мне такой результат:

enter image description here

Я использую очень распространенный Данные Альберса США для создания границ штатов и округов.Я использовал «Штаты», чтобы спроектировать штат Джорджия, а затем я использовал «Кобб», «Фултон» и «Декальб», чтобы спроектировать 3 разных округа Атланта в дополнение к этому.

Это работает, но крайне неэффективно, и было бы очень тяжело сделать это для всех 159 округов штата.Есть ли более простой способ фильтрации округов, чем тот, который я использую?Или какой-нибудь хороший автоматический способ чтения во всех 159 округах без 1000+ строк кода!?

Редактировать: Также для записи я попытался выполнить округы и затем выполнить фильтрацию по штатам, ноэто не сработало.Код ниже:

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

Этот код, кажется, просто делает полную карту округа США.

enter image description here

1 Ответ

3 голосов
/ 01 апреля 2019

Немного странный способ.

Код идентификатора округа начинается с идентификатора штата. С простым трюком 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

enter image description here

...