Vega-Lite / Altair: как центрировать или обрезать карту Европы?

У меня есть данные по европейским странам. Я пытаюсь создать визуализацию в Altair / Vega-Lite, используя данные world-110m. Технически все работает нормально, за исключением того, что закодированные границы стран также включают в себя далекие территории, создавая ужасную карту, которая выглядит так:

Плохая карта Европы

Вот мой код:

countries = alt.topo_feature(data.world_110m.url, 'countries')
source = df.copy()

map = alt.Chart(countries).mark_geoshape(
    stroke='black'
    ).encode(
    color=alt.Color('SomeStat:Q', sort="descending", scale=alt.Scale(
        scheme='inferno', domain=(min_value,max_value)), legend=alt.Legend(title="", tickCount=6))
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(source, 'CountryId', ['SomeStat', 'CountryName'])
).project(
    type='mercator'
)

Есть ли способ обрезать эту карту или центрировать ее так, чтобы я получал только Европу, а не отдаленные территории по всему миру?

В качестве альтернативы, есть ли лучший общедоступный набор данных, который я должен использовать, который включает только Европу?


person Ragnar Lothbrok    schedule 10.04.2020    source источник


Ответы (1)


У меня нет вашего набора данных df, поэтому я публикую довольно простой пример.

import altair as alt
from vega_datasets import data

countries = alt.topo_feature(data.world_110m.url, 'countries')

alt.Chart(countries).mark_geoshape(
    fill='#666666',
    stroke='white'
).project(
    type= 'mercator',
    scale= 350,                          # Magnify
    center= [20,50],                     # [lon, lat]
    clipExtent= [[0, 0], [400, 300]],    # [[left, top], [right, bottom]]
).properties(
    title='Europe (Mercator)',
    width=400, height=300
)

введите здесь описание изображения

Вы можете управлять видом карты с помощью scale и center, а также его фактического размера участка (width и height).

  • scale: параметр увеличения
  • center: центральная точка обзора

Если вам нужно дополнительно обрезать любую часть карты, clipExtent может быть полезен. Будьте осторожны - этот массив представляет размер в пикселях, а не географические координаты. (В приведенном выше примере я установил [[0, 0], [400, 300]], чтобы он сохранял все 400x300 px представление.

person Kazuhito    schedule 10.04.2020
comment
Это прекрасно работает! Я просмотрел всю документацию, но никак не мог понять, где это будет. Спасибо! - person Ragnar Lothbrok; 10.04.2020