Работа с пропущенными значениями / нулями в карте Altair choropleth

#python #data-visualization #choropleth #altair

#python #визуализация данных #choropleth #altair

Вопрос:

Я создал карту choropleth в Altair с данными на уровне штата США. Однако у меня нет данных для некоторых состояний. По умолчанию эти состояния вообще не отображаются на карте. Вот пример изображения:

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

Я бы хотел, чтобы нулевые состояния отображались на карте сероватым цветом. В документации Altair показана другая карта, которая соответствует этому описанию:

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

Мой вопрос в том, как я могу сделать так, чтобы состояния с нулями на 1-й карте отображались так же, как состояния на 2-й карте. Я попробовал несколько вещей. Вот мой код для исходной карты:

 states = alt.topo_feature(data.us_10m.url, 'states')
source = df

alt.Chart(states).mark_geoshape().encode(
    color=alt.Color('avg_prem:Q')
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(source, 'id', ['avg'])
).project(
    type='albersUsa'
).properties(
    width=700,
    height=450
) 
  

Вот код для 2-й карты:

 # US states background
alt.Chart(states).mark_geoshape(
    fill='lightgray',
    stroke='white'
).properties(
    title='US State Capitols',
    width=700,
    height=400
).project('albersUsa')
  

Главное, что я попробовал, это применить параметры заливки и обводки со 2-й карты на 1-й карте:

 alt.Chart(states).mark_geoshape(fill='lightgray',
    stroke='white').encode(
    color=alt.Color('avg_prem:Q')
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(source, 'id', ['avg'])
).project(
    type='albersUsa'
).properties(
    width=700,
    height=450
) 
  

Я мог бы изменить цвет контуров для состояний со значениями таким образом, но не смог заполнить состояния нулями.

Есть ли хороший способ исправить проблему с отсутствующими данными на карте?

Ответ №1:

Одним из подходов было бы использование многоуровневой диаграммы с нужным фоном. Вы не предоставили свои данные, поэтому я не могу на самом деле попробовать, но это может выглядеть примерно так:

 states = alt.topo_feature(data.us_10m.url, 'states')
source = df

foreground = alt.Chart(states).mark_geoshape().encode(
    color=alt.Color('avg_prem:Q')
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(source, 'id', ['avg'])
).project(
    type='albersUsa'
).properties(
    width=700,
    height=400
)  

background = alt.Chart(states).mark_geoshape(
    fill='lightgray',
    stroke='white'
).properties(
    title='US State Capitols',
    width=700,
    height=400
).project('albersUsa')

background   foreground
  

Редактировать: Другой возможный подход заключается в использовании условной кодировки, аналогичной https://vega.github.io/vega-lite/examples/point_invalid_color.html:

 alt.Chart(states).mark_geoshape().encode(
    color=alt.condition('datum.avg_prem !== null', 'avg_prem:Q', alt.value('lightgray'))
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(source, 'id', ['avg'])
).project(
    type='albersUsa'
).properties(
    width=700,
    height=400
)  
  

Комментарии:

1. jakevdp, если вы не возражаете, если я задам дополнительный вопрос, как бы я изменил размер шрифта для заголовка, используя эту методологию? Я думаю, что это на самом деле то, что доставляло мне проблемы. Я использовал .configure_title(font_size = 14), когда я изначально пробовал что-то подобное, и это выдало мне сообщение об ошибке. Итак, я предполагаю, что вместо этого мне нужно что-то сделать с заголовком в разделе .properties () кода, но как мне изменить размер шрифта заголовка оттуда? К сожалению, я не нахожу никаких соответствующих примеров в Интернете.

2. Неважно. Мне потребовалось много времени, но я думаю, что я разобрался. alt. слой (фон, передний план).configure_title(размер шрифта = 24)

3. Да, конфигурации допустимы только на верхнем уровне.