Используйте растровые файлы для создания привлекательных визуализаций с помощью Matplotlib.

Введение

Леса и растительность всегда играли ключевую роль в выживании людей на земле. Они обеспечивают воздух, которым мы дышим, пищу, которую мы едим, и материалы, используемые для строительства наших домов. Благодаря множеству увлекательных исследовательских проектов существует несколько наборов данных с открытым исходным кодом, иллюстрирующих распределение лесов и растительности на Земле. С магией Python мы можем брать эти наборы данных, анализировать их, манипулировать ими и использовать их для создания проницательных и привлекательных визуализаций, подобных показанной выше.

В то время как визуализация данных является, так сказать, целью игры, это упражнение с манипулированием данными и перепроецированием в своей основе. Мы будем использовать rasterio и rioxarray для создания визуализации выше, а также некоторых других интересных графиков.

Исследование данных

Существует несколько наборов данных, и в этом руководстве мы будем использовать набор данных Percent Tree Coverage (PTC) от Управления геопространственной информации Японии, Университета Тиба и сотрудничающих организаций (ссылка на набор данных и информацию о лицензии).

Данные довольно старые и показывают леса с 2003 года, что, очевидно, было довольно давно, однако используемые здесь методы будут применимы к другим наборам данных о лесах и даже к некоторым из более поздних (но гораздо более крупных) данных, хранящихся в этом репозиторий. Действительно, в этом репозитории существует набор данных с более высоким разрешением, однако данные разбиты на 12 отдельных файлов tif, представляющих фрагменты мира размером 90x60 градусов. Объединение различных tif-файлов возможно, но выходит за рамки этого конкретного руководства и, следовательно, будет рассмотрено в следующей статье.

Данные хранятся в tif-файле с разрешением 30 угловых секунд (~ 1 кв. км). В каждой точке сетки tif-файла есть значение от 0 до 100, соответствующее процентному покрытию деревьями на площади в 1 кв. км. Водным объектам присвоено значение 254, а данные 255 не приведены.

Ниже данные открываются и считываются с помощью rasterio. Обратите внимание, что файл загружается и открывается в два разных этапа. Минимальное и максимальное значения печатаются с использованием numpy, чтобы показать, что значение находится в диапазоне от 0 до 254, что означает отсутствие пропущенных данных.

При любой проблеме визуализации данных первое, что нужно сделать, это нанести данные на график, чтобы понять, с чем мы имеем дело. Ниже приведен стандартный imshow график данных с использованием цветовой карты Greens (потому что зачем использовать что-то еще для лесов?).

Очевидная проблема в том, что океаны окрашены в зеленый цвет и там явно нет лесов. Данные масштабируются от 0 до 100 для процентного покрытия деревьями, но есть дополнительная точка данных для водных объектов — 254. При построении данных matplotlib создает карту цветов с линейным масштабированием цветов между наименьшим значением (0) и наибольшим значением ( 254) в наборе данных. Данные, которые нас действительно интересуют, отображаются в первые 101 цвет (~ 40% цветовой карты), есть 153 цвета, которые совершенно не используются (101–253), и один цвет используется для океанов (254). Таким образом, ~ 60% цветов в палитре не используются. Это показано визуально ниже.

Для целей этого упражнения мы собираемся предположить, что океаны имеют 0% покрытие деревьями, что, вероятно, является довольно безопасным предположением, но, по крайней мере, заслуживает упоминания, и, следовательно, в приведенном ниже коде все значения, превышающие 100, изменяются. до 0. Таким образом, на последующих графиках будет 101 значение (0–100), а цветовая карта будет идеально отображаться от самых низких (районы с нулевым лесным покровом и водоемами) до самых высоких (100% лесного покрова) значений.

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

Чтобы создать цветовую карту из списка цветов, мы можем использовать метод ListedColormap, который берет список цветов и генерирует цветовую карту из этих цветов. Поскольку данные представляют собой линейный диапазон значений от 0 до 100, нам не нужно беспокоиться о границах, и мы можем использовать карту цветов без нормализации карты цветов (для получения дополнительной информации о картах цветов и нормализующих картах цветов я много писал о них здесь ).

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

Данные выглядят так, как ожидалось, и важно посмотреть на визуализацию и спросить себя, имеет ли она смысл. Очевидно, есть проблема с тем, как цветовая карта справляется с водными объектами, которая будет рассмотрена ниже, но в целом все обстоит так, как и ожидалось. Есть темно-зеленые зоны, соответствующие тропическим лесам Амазонки, Конго и Юго-Восточной Азии, в северном полушарии видны сплошные области светло-зеленого цвета, соответствующие лиственным лесам Северной Америки и Евразии, и даже есть небольшая зеленая зона тропических лесов на севере. побережье Ирана.

На этом мы могли бы закончить, однако я предпочитаю карты с проекцией Робинсона, поэтому для перепроецирования данных требуется дополнительный шаг. Проекция Робинсона — один из наиболее реалистичных способов построения глобальных наборов данных, учитывающий тот факт, что Земля не плоская.

Воспроизведение геопространственных форм, таких как точки и многоугольники, тривиально, но, к сожалению, сделать то же самое с растровыми данными сложнее. Для этого мы можем использовать rioxarray. rioxarray расширяет xarray с помощью аксессора rio и позволяет обрезать, объединять и перепроецировать растры из файлов tiff и geotiff. Ниже исходный файл tif открывается с помощью rioxarray (он использует некоторые базовые функции rasterio, отсюда и метод open_rasterio), проекция Робинсона определяется как объект rasterio.CRS, а затем растр перепроецируется на этот CRS. Следует отметить, что объект rasterio.CRS создается из строки pyproj. pyproj — это фантастическая библиотека, которая работает с картографическими проекциями и преобразованиями координат, и о ней я расскажу в следующей статье.

Затем данные можно нанести на график с использованием той же цветовой карты, что и раньше, чтобы получить нашу карту лесов в проекции Робинсона.

С одной стороны, при использовании линейных одноцветных цветовых карт часто можно потерять данные на более светлом конце цветовой карты, поэтому для развлечения вы можете использовать странную и замечательную цветовую карту, чтобы каждая точка данных отображалась четко, 0–100. . Ниже показан тот же график, что и раньше, но на этот раз с использованием цветовой карты gnuplot.

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

Выводы

Вот она, красивая карта, показывающая, как создавать привлекательную визуализацию данных, показывающую леса мира. Это первая из многих запланированных статей, в которых будет показано, как сделать так, чтобы геопространственные данные выглядели потрясающе с помощью Python. Пожалуйста, подпишитесь, чтобы не пропустить их. Я также люблю отзывы, поэтому, пожалуйста, дайте мне знать, как бы вы сделали это по-другому или предложите изменения, чтобы сделать его еще более удивительным. Каждую неделю я публикую визуализации данных в своем аккаунте в Твиттере, посмотрите, подходят ли вам геопространственные данные https://twitter.com/PythonMaps

Дополнительные копейки, которые предоставляет среда, действительно помогают поддерживать этот проект, поэтому, если вы являетесь фанатом и хотите отменить свою учетную запись и снова зарегистрироваться, используя мою реферальную ссылку, это было бы здорово. https://pythonmaps.medium.com/membership

Рекомендации

Ссылки на источник данных и библиотеки, необходимые для этого руководства.

Данные — https://globalmaps.github.io/ptc.html

Матплотлиб — https://matplotlib.org/

Нумпи — https://numpy.org/

Растерио — https://rasterio.readthedocs.io/en/latest/

rioxarray — https://corteva.github.io/rioxarray/stable/

pyproj — https://pyproj4.github.io/pyproj/stable/