Как изменить ограничения для geo_shape в altair (python vega-lite)

Я пытаюсь построить локации в трех штатах США на питоне с помощью Altair. Я видел учебник о карте США, но мне интересно, есть ли способ увеличить изображение только до трех представляющих интерес штатов, то есть Нью-Йорка, Нью-Джерси и Коннектикута.

В настоящее время у меня есть следующий код:

from vega_datasets import data            
states = alt.topo_feature(data.us_10m.url, 'states')

# US states background
background = alt.Chart(states).mark_geoshape(
    fill='lightgray',
    stroke='white',
    limit=1000
).properties(
    title='US State Capitols',
    width=700,
    height=400
).project("albers")
            
points=alt.Chart(accts).mark_point().encode(
        longitude = "longitude",
        latitude = "latitude",
        color = "Group")

background+points

Я проверил набор данных us_10m.url и, похоже, нет поля, которое определяло бы отдельные состояния. Так что я надеюсь, что смогу как-то изменить xlim и ylim для фона, например, на [-80, -70] и [35,45]. Я хочу увеличить область, где есть точки данных (синие точки).

Может ли кто-нибудь показать мне, как это сделать? Спасибо!!

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

Обновлять

В файле JSON есть поле под названием ID, и я вручную выяснил, что NJ - 34, NY - 36 и CT - 9. Есть ли способ отфильтровать эти идентификаторы? Это выполнит свою работу!


person convertibile IkE    schedule 28.01.2019    source источник


Ответы (1)


Хорошо, похоже, что функция выбора / масштабирования / xlim / ylim для геотипа еще не поддерживается: Документ и добавить предупреждение о том, что геопозиция еще не поддерживает выбор # 3305

Итак, я пришел к хакерскому способу решения этой проблемы, сначала отфильтровав на основе идентификаторов с использованием чистого python. По сути, загрузите файл JSON в словарь, а затем измените поле значения перед преобразованием словаря в формат topojson. Ниже приведен пример для 5 штатов: Пенсильвания, Нью-Джерси, Нью-Йорк, Коннектикут, Род-Айленд и Массачусетс.

import altair as alt
from vega_datasets import data
# Load the data, which is loaded as a dict object
us_10m  = data.us_10m()
# Select the geometries under states under objects, filter on id (9,25,34,36,42,44)
us_10m['objects']['states']['geometries']=[item for item in us_10m['objects'] \
      ['states']['geometries'] if item['id'] in [9,25,34,36,42,44]]
# Make the topojson data
states = alt.Data(
    values=us_10m, 
    format=alt.TopoDataFormat(feature='states',type='topojson'))

# Plot background (now only has 5 states) 
background = alt.Chart(states).mark_geoshape(
    fill='lightgray',
    stroke='white',
    limit=1000
).properties(
    title='US State Capitols',
    width=700,
    height=400
).project("mercator")

# Plot the points
points=alt.Chart(accts).mark_circle(size=60).encode(
    longitude = "longitude",
    latitude = "latitude",
    color = "Group").project("mercator")

# Overlay the two plots
background+points

Получившийся сюжет выглядит нормально:

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

person convertibile IkE    schedule 29.01.2019