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

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
(сохранение прогресса)
Нет описания правки
Строка 17: Строка 17:
# Вывести их на карту в качестве элемента условного знака объекта.
# Вывести их на карту в качестве элемента условного знака объекта.


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


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


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


Для того, чтобы отобразить диаграммы в качестве условного знака надо зайти в свойства точечного слоя и во вкладке ''Style'' задать тип символа слоя: SVG-маркер (если у вас сполигональный слой, то ''Centroid Fill -> Marker -> SVG-marker''). Справа от адресной строки задания пути к файлу нажмите кнопку Data defined override и выберите ''Field type: sting'' и задайте нужный аттрибут, см. скриншот:
Для того, чтобы отобразить диаграммы в качестве условного знака надо зайти в свойства точечного слоя и во вкладке ''Style'' задать тип символа слоя: SVG-маркер (если у вас полигональный слой, то ''Centroid Fill -> Marker -> SVG-marker''). Справа от адресной строки задания пути к файлу нажмите кнопку Data defined override и выберите ''Field type: sting'' и задайте нужный атрибут, см. скриншот:
[[Файл:Svg from field.png|thumb|center|x450px|Задание SVG-маркера из значения атрибута]]
[[Файл:Svg from field.png|thumb|center|x450px|Задание SVG-маркера из значения атрибута]]


Строка 32: Строка 32:


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


Вот какие задачи небходимо решить на этапе создания диаграмм:
Вот какие задачи небходимо решить на этапе создания диаграмм:
====Подобрать палитру====
* '''Подобрать палитру'''
Для этого как нельзя лучше подходит инструмент для подбора палитры [http://colorbrewer2.org/ Color Brewer]. К сожалению, обеспечить отчётливое восприятие отдельных цветов и оттенков возможно только при довольно ограниченном наборе объектов для раскрашивания. Естественное ограничение - примерно 10 цветов, нам же нужно составить палитру для 20(!). Но выход есть - можно объединить две "количественные"  палитры по 10 цыетов в каждой, таким образом
Для этого как нельзя лучше подходит инструмент для подбора палитры [http://colorbrewer2.org/ Color Brewer]. К сожалению, обеспечить отчётливое восприятие отдельных цветов и оттенков возможно только при довольно ограниченном наборе объектов для раскрашивания. Естественное ограничение - примерно 10 цветов, нам же нужно составить палитру для 20(!). Но выход есть - можно объединить [http://colorbrewer2.org/?type=qualitative&scheme=Paired&n=10 две "количественные"  палитры по 10 цветов]:
[[Файл:Color palettes.png|thumb|center|x200px|Две "количественные" палитры]]
[[Файл:Color palettes.png|thumb|center|x200px|Две "количественные" палитры]]
====Сделать фон дигаммы прозрачным====
* '''Добавить несуществующие данные'''
====Сделать фон области значений диаграммы прозрачным====
Это необходимо для того, чтобы внешний облик диаграмм не претерпевал значительных изменений при добавлении новых значений (см. код скрипта).
====Удалить сетку области значений диаграммы (опционально)====
* '''Сделать фон дигаммы прозрачным'''
====Удалить легенду====
(Здесь и далее приведены параметры для построения графиков в "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, снабжённый необходимыми комментариями.
Ниже приведён код скрипта для запуска из Processing Toolbox, снабжённый необходимыми комментариями.

Версия от 13:38, 29 марта 2015

Эта страница является черновиком статьи.


В 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, снабжённый необходимыми комментариями.