Создание и визуализация пользовательских диаграмм и графиков в QGIS при помощи R

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


В QGIS есть встроенные инструменты построения графиков. С их помощью вы можете построить гистограммы, круговые диаграммы и текстовые диаграммы. К сожалению, встроенные инструменты обладают рядом недостатков, таких как множественные артифакты при рендеринге, громоздскость при отображении большого количества данных, непривлекательный вид. Создание собственных графиков может решить чать этих проблем. В данной статье показано, как используя R можно создавать пользовательские графики для QGIS.

Идея

Мы можем создать необходимые графики в формате SVG сторонними инструментами и отображать их в качетсве [части] условного знака необходимого объекта. Здесь будет показано применение программной среды R, в частности, пакета "ggplot2".

Смоделируем ситуацию. Предположим, нам надо отобразить на диаграмме некоторые величины, находящиеся в атрибутах векторного слоя. Пусть у нас будет 12 атрибутов с необходимыми значениями, но мы знаем, что в будущем их количество увеличится до 20.

Если мы попытаемся использовать встроенные инструменты, то полученные диаграммы загромоздят значительную область экрана (гистограммы), либо будут практически нечитаемы (текстовые диаграммы). В нашем случае лучше всего подойдут радиальные диаграммы.

Вот так будет выглядеть конечный результат (два варианта):

Радиальная диаграмма с сеткой
Радиальная диаграмма без сетки

Итак, нам нужно решить следующие задачи:

  1. Создать диаграммы в формате SVG.
  2. Вывести их на карту в качестве элемента условного знака объекта.

Так как вторая задача проще и, возможно, вы предпочитаете использовать другое ПО для создания диаграмм, то сначала объясним как визуализировать уже готовые диаграммы.

Визуализация диаграмм в QGIS

Здесь всё довольно просто. Поместите все диаграммы в одну папку и дайте им имена, соответствующие уникальным идентификаторам объектов в таблице атрибутов к которым они относятся. Например, если у векторного слоя есть атрибут "ID", содержащий значения типа 0, 1, 2..., то назовите соответствующие им диаграммы 0.svg, 1.svg, 2.svg...

Теперь перейдём к редактированию векторного слоя. Создайте текстовый атрибут в котором будет храниться путь к диаграммам (убедитесь, что поля будут способны вместить достаточное количество символов). Для заполнения полей атрибута воспользуемся калькулятором полей. Вот это простое выражение позволит справится с задачей:

 'путь/к/папке/с/диаграммами/' || "ID" || '.svg'

Приведённое выражение создаёт строку текста путём присоединения к пути к папке значения атрибута "ID" и расширения файла. Таким образом, для каждого объекта слоя будет записан путь к файлу с его диаграммой. Обратите внимание, что статические (неизменные) значения заключены в одинарные кавычки ('), а динамические (извлекаемые из соответствующего атрибута слоя) - в двойные ("); кроме того, не забывайте, что последним символом в пути к папке должен быть слеш, в противном случае, полученный путь будет неправильным (например, 'путь0.svg', вместо 'путь/0.svg'). Создание атрибута для сохрания пути и его заполнение можно произвести одновременно - выберите опцию "создать новое поле" в калькуляторе полей.

Для того, чтобы отобразить диаграммы в качестве условного знака надо зайти в свойства точечного слоя и во вкладке Style задать тип символа слоя: SVG-маркер (если у вас полигональный слой, то Centroid Fill -> Marker -> SVG-marker). Справа от адресной строки задания пути к файлу нажмите кнопку Data defined override и выберите Field type: sting и задайте нужный атрибут, см. скриншот:

Задание SVG-маркера из значения атрибута

Обязательно задайте размеры маркера побольше - от 15 мм, а то диаграмма будет неразличима.

Создание скрипта R для построения диаграмм

Это - самая сложная часть. Неискушённому пользователю придётся порядочно покопаться в документации к "ggplot2" и соответствующих примерах, чтобы разобраться, как контролировать различные аспекты визуализации. Не будем вдаваться во все тонкости (читайте мануалы), отметим только основные моменты.

Вот какие задачи небходимо решить на этапе создания диаграмм:

  • Подобрать палитру

Для этого как нельзя лучше подходит инструмент для подбора палитры Color Brewer. К сожалению, обеспечить отчётливое восприятие отдельных цветов и оттенков возможно только при довольно ограниченном наборе объектов для раскрашивания. Естественное ограничение - примерно 10 цветов, нам же нужно составить палитру для 20(!). Но выход есть - можно объединить две "количественные" палитры по 10 цветов:

Две "количественные" палитры
  • Добавить несуществующие данные

Это необходимо для того, чтобы внешний облик диаграмм не претерпевал значительных изменений при добавлении новых значений (см. код скрипта).

  • Сделать фон дигаммы прозрачным

(Здесь и далее приведены параметры для построения графиков в "ggplot2")

 plot.background = element_blank()
  • Сделать фон области значений диаграммы прозрачным
 panel.background = element_blank()
  • Удалить сетку области значений диаграммы (опционально)
 panel.grid = element_blank()
  • Удалить легенду
 legend.position = 'none'
  • Удалить подписи к осям и объектам
 axis.text.x = element_blank(),
 axis.text.y = element_blank()
  • Обрезать поля диаграммы
 plot.margin = unit(c(0,0,-0.3,-0.3), 'cm')
  • Сохранить диаграммы на диск с сохранением прозрачности фона
 ggsave(file = 'имя_файла_и_путь', plot = p, width = 5, height = 5, units = 'cm', bg = "transparent")
  • Создать полноценную диаграмму-легенду для расшифровки созданных диаграмм

Для этого нужно построить диаграмму такого же типа, как и для объектов слоя, но с легендой, подписями и максимальными значениями данных.

Скрипт на R для Processing Toolbox

Вот так выглядит окно настраиваемых параметров скрипта при его запуске из Processing Toolbox

Окно скрипта

Список параметров:

  • layer - векторный слой с данными для диаграммы.
  • ID - атрибут, содержащий уникальные значения.
  • start_field - атрибут с которого начинается серия атрибутов, содержащих значения для построения диаграмм (атрибуты должны идти подряд).
  • end_field - атрибут на котором заканчивается серия атрибутов, содержащих значения для построения диаграмм (атрибуты должны идти подряд).
  • add_ghost_data - требуется ли добавлять несуществующие атрибуты? Ставьте галочку, если планируете в будущем добавить дополнительные атрибуты и переделывать диаграммы.
  • total_bins_including_ghosts - если требуется добавить несуществующие атрибуты - указать общее количество атрибутов по которым будут строиться диаграммы в будущем.
  • ghost_value - если требуется добавить несуществующие значения - укажите значение которое будет присвоено дополнительным атрибутам на данный момент.
  • plot_width - ширина SVG-диаграмм в сантиметрах.
  • plot_height - высота SVG-диаграмм в сантиметрах.
  • palette - палитра для раскраски значений атрибутов диаграммы в виде HEX-кодов

Ниже приведён код скрипта для запуска из Processing Toolbox, снабжённый необходимыми комментариями. Обратите внимание, что элементы графического интерфейса (входные параметры скрипта) задаются двойным знаком "#":

 ##Переменная = параметр дефолтное_значение
##Plotting = group
##layer=vector
##ID=field layer
##start_field= field layer
##end_field= field layer
##add_ghost_data=boolean False
##total_bins_including_ghosts=number 20
##ghost_value=number 0
##plot_width=number 5
##plot_height=number 5
##palette=string #a6cee3,#1f78b4,#b2df8a,#33a02c,#fb9a99,#e31a1c,#fdbf6f,#ff7f00,#cab2d6,#6a3d9a,#8dd3c7,#ffffb3,#bebada,#fb8072,#80b1d3,#fdb462,#b3de69,#fccde5,#d9d9d9,#bc80bd
##out_folder=folder
##showplots