2025, Sep 17 05:01

Исправляем хороплетную карту Индии в Plotly: правильный ключ соединения по district

Почему хороплет Индии в Plotly выглядит искаженно и как это исправить: связывайте данные с GeoJSON по district, а не по штату. Пример кода и советы по проекции.

Исправляем искаженную хороплетную карту Индии в Plotly: выбираем правильный ключ соединения

Если хороплетная карта Индии выглядит сплюснутой или границы штатов кажутся подозрительно маленькими, дело часто не в проекции. В этом случае карта строилась по геометрии районов, а данные сопоставлялись по названиям штатов. Из‑за такого несоответствия слой отрисовывался неправильно, и визуализация на первый взгляд казалась неверной.

Исправленный пример

Ниже — минимальная конфигурация, которая корректно связывает ваш датафрейм с GeoJSON. Главное изменение — соединять объекты по району, а не по штату. Дополнительно убрано дублирующее центрирование и установлен более разумный масштаб проекции.

import plotly.express as px
map_df = geo_df
shape_src = geojson_data
chart = px.choropleth(
    map_df,
    geojson=shape_src,
    locations="district",
    featureidkey="properties.district",
    color="Accidents",
    center=dict(lat=22, lon=80)
)
chart.update_geos(projection_scale=3)
chart.show()

Что пошло не так и почему это происходит

Объекты GeoJSON описывают районы, и у каждого есть значение properties.district. В датафрейме тоже есть строки уровня районов со столбцом Accidents. Когда карте указывают соединять по полю штата, например st_nm, Plotly пытается сопоставить каждому районному контуру один и тот же ярлык штата. У многих объектов совпадает название штата, поэтому связь «многие к одному» приводит к вводящей в заблуждение отрисовке: фигуры выглядят неестественно, а визуальный масштаб кажется неправильным. Иными словами, геометрия детализирована по районам, а ключ для сопоставления агрегирован на уровне штата.

Решение

Согласуйте ключи соединения с детализацией геометрии. Используйте поле района и в датафрейме, и в GeoJSON: задайте locations равным "district", а featureidkey"properties.district". Это убирает неоднозначность и позволяет Plotly корректно раскрашивать и отображать каждый полигон района. Заодно оставьте только одну настройку center и выберите масштаб проекции, который адекватно кадрирует Индию; значение 3 — практичная отправная точка для обзора уровня страны.

Почему это важно

Хороплеты зависят от корректного соединения объектов. Если ключ не совпадает с уровнем геометрии, карта может исказиться, дублирующиеся регионы получат один цвет без отражения реальных значений, и визуальный смысл станет вводящим в заблуждение. Важно, чтобы атрибутный ключ соответствовал уровню полигона — это основа надежного геопространственного анализа и корректной коммуникации паттернов, например количества аварий по районам.

Выводы

Всегда проверяйте, что ваш столбец locations соответствует детализации featureidkey в GeoJSON. Для полигонов районов соединяйте по району; для полигонов штатов — по штату. Держите настройки карты минимальными и осмысленными: один center, разумный projection_scale и атрибуты, которые присутствуют и в датафрейме, и в источнике геометрии. Если после исправления соединения границы всё ещё выглядят неточно, подберите более точный районный GeoJSON, прежде чем делать выводы по визуализации.

Статья основана на вопросе с StackOverflow от Ryan_Brusseau и ответе от pixel-process.