Матрунич Консалтинг

Анализ данных, визуализация, маркетинговые исследования, язык R

Tag: ggplot2

Что такое грамматика графики ggplot2 (ч.3)

Вы открыли продолжение статьи об основах ggplot2. Читайте начало в

  1. Что такое грамматика графики ggplot2 (ч.1)
  2. ggplot2: сопоставления, визуальные средства, статистические преобразования и слои

Подписи осей графика в ggplot2

Снова вернёмся к начальному графику из первой части:

fig <- ggplot(data = cars, aes(x = speed, y = dist)) + geom_point()
fig

ggplot(data = cars, aes(x = speed, y = dist)) + geom_point()

Обратите внимание, здесь я сохранил объект класса ggplot в переменной fig. То есть вся информация о нашем графике теперь хранится в этой переменной. Во второй строке я вызываю эту переменную, и здесь, собственно, происходит отрисовка.

Ggplot2 автоматически взял названия для осей из имён переменных, которые мы использовали для построения графика. Авторы ggplot2 предлагают сразу несколько вариантов того, как можно изменить названия осей. Можно использовать функции ylab(), xlab():

fig + xlab("Скорость, миль в час") +
  ylab("Тормозной путь, футы")
ggplot(data = cars, aes(x = speed, y = dist)) + geom_point() + xlab("Скорость, миль в час") + ylab("Тормозной путь, футы")

ggplot(data = cars, aes(x = speed, y = dist)) + geom_point() + xlab("Скорость, миль в час") + ylab("Тормозной путь, футы")

Аналогично можно использовать функцию labs():

fig + labs(x = "Скорость, миль в час",
           y = "Тормозной путь, футы")

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

Следующий вариант будет удобен, если помимо названия вы хотите сделать в оси дополнительные изменения: например, изменить расположение основных и вспомогательных линий сетки, задать собственный диапазон значений оси. В нашем случае функция для определения этих параметров называется scale_x_continuous(). К чему такое сложное название функции? Давайте вспомним про то, что пакет ggplot2 — это не очередное R-расширение для создания диаграмм, а целая концепция графической грамматики. И с этой точки зрения, подпись горизонтальной оси — это не просто текстовая строка, расположенная под абсциссой, а элемент инструкции (guide), которая призвана помочь человеку, смотрящему на график, правильно понять, что за информация передаётся с помощью горизонтальной оси. Поэтому логично поместить все параметры одного элемента графика в одну функцию. А функции labs() и ylab()/xlab() — это лишь удобные ярлыки, созданные для уменьшения нагрузки на суставы ваших пальцев и клавиатуру.

Итак, пересилим себя и зададим названия осей с помощью функций scale_*:

fig + scale_x_continuous(name = "Скорость, миль в час") +
  scale_y_continuous(name = "Тормозной путь, футы")

Расширим наше использование scale_* и «поиграем» с характеристиками осей.

fig + scale_x_continuous(name = "Скорость, миль в час",
                         breaks = c(7, 10, 20),
                         limits = c(6, 22)) +
  scale_y_continuous(name = "Тормозной путь, футы",
                     limits = c(5, 50),
                     breaks = NULL)
Точечный график ggplot2 с модификацией осей через scale_continuous()

Точечный график ggplot2 с модификацией осей через scale_continuous()

Здесь по горизонатальной оси мы «обрезали» края графика, выходящие за пределы менее 6 и более 22 миль в час, и указали, чтобы линии сетки проходили только по точкам 7, 10 и 20 миль в час. Аналогичная операция проведена для вертикальной оси, только целиком убраны горизонтальные линии сетки и соответствующие подписи.

Работа с легендами графика

Добавим к графику цвет.

fig2 <- ggplot(data = cars, aes(speed, dist, color = speed)) + geom_point()
fig2
Точечный график ggplot2 с окраской точек

Точечный график ggplot2 с окраской точек

Обратите внимание, я не стал в функции aes() указывать названия аргументов x и y. Так можно делать, так как, если вы не указываете в aes() имена первых двух аргументов, то aes() «думает», что первым аргументом является положение по горизонтали, а вторым — по вертикали.

Чтобы задать собственное название легенды, мы опять обращаемся к функции из семейства scale_*.

fig2 + scale_color_continuous("Скорость") #Снова не указываю имя аргумента
Точечный крафик ggplot2 с исправленным названием цветовой легенды

Точечный крафик ggplot2 с исправленным названием цветовой легенды

Название графика

Название графика можно добавить одной из двух функций: ggtitle() или labs().

fig2 + scale_color_continuous("Скорость") +
  ggtitle("Влияние скорости автомобиля\nна длину тормозного пути") +
  xlab("Скорость, миль в час") +
  ylab("Тормозной путь, футов")
График ggplot2 с названием, именованными осями и легендой

График ggplot2 с названием, именованными осями и легендой

Дополнительную информацию о настройке внешнего вида графика можно почерпнуть на англоязычном сайте одного из разработчиков ggplot2 Уинстона Чанга Cookbook for R

Вы прочитали продолжение статьи. Начало читайте в:

  1. Что такое грамматика графики ggplot2 (ч.1)
  2. ggplot2: сопоставления, визуальные средства, статистические преобразования и слои

Что такое грамматика графики ggplot2 (ч.2)

Продолжение. Читайте начало в Что такое грамматика графики ggplot2 (ч.1)

Читайте продолжение в Названия элементов графика ggplot2: название графика, осей, легенд

Визуальные средства и геометрические объекты

Визуальные средства для отрисовки геометрических объектов типа «точка» (point) — это расположение по горизонтали (x) и вертикали (y), цвет границы (colour) и цвет заливки (fill), размер (size), форма (shape), прозрачность (alpha). Обязательными для создания точечного графика являются только первые два параметра: положение по вертикали и горизонтали. В примере с автомобилями мы привязали скорость к положению по горизонтали, а тормозной путь — к положению по вертикали. Оставшиеся визуальные средства можно было бы использовать для передачи на графике другой информации, если бы она содержалась в исходном массиве данных cars. Или мы можем продублировать информацию, передаваемую через положение, другими визуальными средствами. «Нагрузим» цвет точки скоростью.

ggplot(data = cars, aes(x = speed, y = dist, color = speed)) + geom_point()
ggplot(data = cars, aes(x = speed, y = dist, color = speed)) + geom_point()

ggplot(data = cars, aes(x = speed, y = dist, color = speed)) + geom_point()

Алгоритм определил, что speed — это числовая (интервальная) переменная и, по умолчанию для этого типа, предложил палитру в виде градации от тёмно-синего до голубого. Чем выше скорость, тем светлее точка. Также, поскольку наш график «обзавёлся» дополнительной информацией, передаваемой через цвет, то алгоритм сам добавил в картинку легенду со значениями цвета. В наших силах также выбрать другую цветовую палитру, дать другое название легенде и разместить легенду в другом месте графика, но сейчас не будем на это отвлекаться.

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

ggplot(data = cars, aes(x = speed, 
                        y = dist, 
                        color = speed, 
                        size = dist)) + geom_point()
ggplot(data = cars, aes(x = speed, y = dist, color = speed, size = dist)) + geom_point()

ggplot(data = cars, aes(x = speed, y = dist, color = speed, size = dist)) + geom_point()

Новая версия графика: чем больше размер точки, тем длинее тормозной путь автомобиля. Также алгоритм добавил новый элемент легенды, сопоставляющий размер точки и длину пути.

Статистические преобразования

Вернёмся к самому первому графику из первой части:

ggplot(data = cars, aes(x = speed, y = dist)) + geom_point()

ggplot(data = cars, aes(x = speed, y = dist)) + geom_point()

В этом примере схема построения графика на первый взгляд выглядит так:

  1. Берётся массив данных cars.
  2. Переменная speed сопоставляется положению по горизонтали (абсциссе), переменная dist — положению по вертикали (ординате).
  3. На графике отображаются точки с соответствующими координатами.

Между вторым и третим пунктом остался незамеченным важный элемент: статистическое преобразование данных. Подход ggplot2 подразумевает, что для отрисовки графического объекта исходные данные нужно преобразовать. Например, для перед построением гистограммы алгоритм соответствующего статистического преобразования должен посчитать, сколько наблюдений попадает в каждый интервал, а затем передать данные о границах каждого интервала и о количестве элементов в алгоритм построения геометрического объекта. В нашем случае, когда рисуются точки, данные никак преобразовывать не нужно, поэтому на этапе преобразования используется stat_identity() — тождественное преобразование, то есть без изменений.

Взглянем на распределение длин тормозных путей и построим график, требующий более сложных вычислений: «Ящик с усами». Он покажет нам информацию о медиане, квартилях и наличии выбросов. Поскольку график такого типа удобно использовать для сравнения групп, то мы разделим наш массив на две группы: в первой автомобили, у которых скорость 15 миль в час и меньше, а во второй — у кого больше.

ggplot(data = cars, aes(x = speed > 15, y = dist)) + geom_boxplot()
ggplot(data = cars, aes(x = speed > 15, y = dist)) + geom_boxplot()

ggplot(data = cars, aes(x = speed > 15, y = dist)) + geom_boxplot()

Более полная схема построения графика следующая:

  1. Берётся массив данных cars.
  2. Результат выполнения выражения cars$speed > 15 сопоставляется абсциссе, переменная dist — ординате. При этом абсцисса (x) из числовой переменной (мили в час) превратилась в категориальную (логическую: больше 15 миль в час или нет), поэтому все наблюдения разбились на эти две категории.
  3. Данные передаются статистическому преобразованию stat_boxplot(), которое из предыдущего шага знает, что cars$speed > 15 нужно использовать для деления массива на группы, а dist — для расчёта статистик, необходимых для отрисовки «ящиков с усами».
  4. Результаты работы stat_boxplot(), а это для каждой группы медиана, квартили, границы нижнего и верхнего «усов», передаются алгоритму отрисовки.

Нам не понадобилось явно задавать stat_boxplot() в коде, т.к. это статистическое преобразование вызывается по умолчанию при отрисовке «ящиков с усами». Явно указывать статистику имело бы смысл в такой ситуации, когда наш массив уже содержит все необходимые данные для geom_boxplot() (медиану, квартили и пр.), и мы бы захотели изменить способ статистического преобразования: geom_boxplot(stat="identity")

Слои графика

Каждый раз, когда вы в R добавляете к своему ggplot2-объекту новые geom_*() или stat_*(), на вашем графике появляется новый слой. Добавим к нашим «ящикам» слой с точками.

ggplot(data = cars, aes(x = speed > 15, y = dist)) +
  geom_boxplot() + 
  geom_point()
ggplot(data = cars, aes(x = speed > 15, y = dist)) + geom_boxplot() + geom_point()

ggplot(data = cars, aes(x = speed > 15, y = dist)) + geom_boxplot() + geom_point()

Здесь сначала по старой схеме были отрисованы «ящики», а затем на основе тех же самых данных, тех же самых сопоставлений добавлены точки.

Читайте первую часть статьи в Что такое грамматика графики ggplot2 (ч.1)

Читайте продолжение статьи в Названия элементов графика ggplot2: название графика, осей, легенд

Что такое грамматика графики ggplot2 (ч.1)

Начало. Продолжение в

Что такое ggplot2 и ggvis

ggplot2 – это расширение языка R, предназначенное для визуализации данных. Для создания графики ggplot2 использует систему абстрактных понятий: массив данных, визуальные средства, геометрические объекты, сопоставление переменных из массива визуальным средствам, статистическое преобразование переменных, системы координат и пр. Пакет ggplot2 является одним из самых популярных среди R-пользователей: в январе-мае 2013 года его скачали не менее 82 тысяч раз, что ставит его на третье место среди всех R-расширений (если учесть, что второе место занимает пакет digest, который используется для вычисления криптографических хеш-значений объектов в R, т.е. вряд ли он часто применяется пользователями напрямую, а гораздо чаще является зависимостью для других расширений, в т.ч. и для ggplot2, то ggplot2 переезжает на второе место). Функции ggplot2 берут на себя решение многих второстепенных вопросов (нужна ли легенда, где её разместить, какие границы выбрать для осей и пр.) и позволяют пользователю сконцентрироваться на самом важном. Для эффективного использования функционала ggplot2 пользователю необходимо понять принципы, заложенные в этом расширении.

Необходимо добавить несколько слов про ggvis: это совсем свежий R-пакет, реализующий идеи грамматики графики в интерактивном веб-ключе. Если ggplot2 вы будете использовать для создания статичных изображений, то ggvis предназначен для производства визуализаций аналогичного плана, но они будут интерактивными. В качестве бэкэнда визуализации ggvis использует vega, которая, в свою очередь, покоится на плечах D3.js, а для организации взаимодействия с пользователем ggvis использует R-расширение shiny.

Краткая предыстория создания ggplot2

ggplot2 начинался с того, что его будущий создатель Хэдли Викхэм прочитал книгу Лэланда ВилкинсонаThe Grammar of Graphics“. Среди прочего Вилкинсон – это тот товарищ, который в статистическом пакете SPSS поменял предыдущую систему визуализации на новую, основанную на оригинальном языке программирования графики GPL (не путать с названием лицензионного договора GNU General Public License!).

И в 2005 году Викхэм создаёт своё первое расширение для R – он реализует идеи, представленные в книге Вилкинсона, в R-коде пакета ggplot. Это был его первый пакет для R, и, как позже говорит сам Хэдли, написан он был не самым лучшим образом (с точки зрения позднего Хэдли 🙂 ). Сегодня Хэдли – автор уже не одного десятка разных пакетов, включая лидера из упомянутого выше рейтинга. В 2007 году Хэдли выпустил радикально переделанный ggplot и, чтобы не ломать скрипты и пакеты, написанные другими пользователями под синтаксис первой версии, он меняет название на ggplot2. В 2009 году Хэдли публикует книгу ggplot2: Elegant Graphics for Data Analysis. В 2012 году выходит очередная версия пакета под номером 0.9, одно из значительных улучшений в которой – это переделанная внутренняя структура, которая упрощает сторонним пользователям процесс подключения к разработке ggplot2. В начале 2014 года в git-репозитории ggplot2 насчитывается 21 разработчик. Хэдли – молодец, он смог грамотно перевести ggplot2 из формата личного проекта на рельсы разработки открытым сообществом. А это, я подозреваю, не просто! Нужно было наступить на горло своей песне, сократить время, затрачиваемое на чистую разработку и добавление функций, а сконцентрироваться на такой “скучной ерунде”, как написание документации, комментирование кода и т.д.

25 февраля 2014 года в почтовой группе, посвящённой ggplot2, Хэдли Викхэм официально объявил, что отныне работа над ggplot2 будет вестись в режиме поддержки: сами разработчики больше не будут добавлять в расширение новые функции, будут только вылавливать ошибки. Добавлением новых функций будут заниматься сами пользователи, которые могут дорабатывать ggplot2 и предлагать включать свои наработки в официальную версию. Соответственно, чтобы подчеркнуть переход ggplot2 на новый этап, версия расширения сменится на 1.0.0, а Хэдли ещё напишет популярным языком инструкцию о том, как сообщать об ошибках и предлагать свои наработки (чувствуете, опять работа с сообществом!).

Основы графической грамматики

В ggplot2 график является результатом взаимодействия ряда элементов:

  • Массив данных (data)
  • Схема соответствия переменных из массива визуальным средствам (aesthetic)
  • Геометрический объект (geom)
  • Статистическое преобразование (stat)
  • Координатная система (coord)
  • Ориентиры (guide)
  • Панели (facet)
  • Художественное оформление (theme)

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

Вы спросите, а почему не заданы статистическое преобразование, координатная система, ориентиры и прочее. Все явно не указанные пользователем элементы графика берутся из значений по умолчанию. Например, если пользователь в качестве графического объекта указал тип “точки”, то по умолчанию статистических преобразований производиться не будет. А если он укажет тип “столбик”, то наблюдения в исходной переменной будут сгруппированы, а результатом применения статистики станет количество наблюдений в каждой группе.

На языке ggplot2 (да-да, я не оговорился: язык ggplot2 – это отдельный язык, а не R, но об этом позже) пример с точками будет выглядеть так:

ggplot(data = cars, aes(x = speed, y = dist)) + geom_point()

ggplot(data = cars, aes(x = speed, y = dist)) + geom_point()
Аналогичный результат мы получим, если укажем не геометрию (geom_point), а соответствующую ей по умолчанию статистику (stat_identity).

ggplot(data = cars, aes(x = speed, y = dist)) + stat_identity()

Пример со столбиками:

ggplot(data = cars, aes(x = speed)) + geom_bar()

ggplot(data = cars, aes(x = speed)) + geom_bar()
Умолчания распространяются и на другие элементы графика. Координатная система по умолчанию – декартова (coord_cartesian). Можем заменить на полярные координаты (coord_polar):

ggplot(data = cars, aes(x = speed)) + geom_bar() + coord_polar()

ggplot(data = cars, aes(x = speed)) + geom_bar() + coord_polar()
А что за дурацкий серый фон у графиков – часто звучит такой вопрос. Это тоже умолчание, но теперь уже в оформлении (theme_grey). Предполагается, что пользователь поместит график в публикацию, т.е. окружит его текстом. В обычной публикации цвет фона (бумаги) – белый, чернила – чёрные. “Средний” цвет страницы – серый. Если график сделать на белом фоне, то он будет резко выделяться на странице и вносить дисгармонию. А серый фон предназначен для уравновешивания цветового баланса страницы.

# Чёрно-белое оформление
ggplot(data = cars, aes(x = speed, y = dist)) + stat_identity() + theme_bw()

ggplot(data = cars, aes(x = speed, y = dist)) + stat_identity() + theme_bw()


Как нарисовать картограмму с помощью ggplot2 и ggmap


Продолжение в

Рисуем картограмму в R средствами ggplot2

Что такое картограмма

Плотность населения районов Псковской области. Картограмма сделана в ggplot2

Плотность населения районов Псковской области. Картограмма сделана в ggplot2


Картограмма – это график, демонстрирующий распределение какого-либо статистического показателя по географическим единицам. На картограмме границы географических единиц (континенты, страны, районы, кварталы) обозначены линиями, а площадь этих единиц залита разными цветами. Цвет показывает категорию или интенсивность показателя. Мы построим картограмму плотности населения районов Псковской области. Чем выше плотность населения района, тем более интесивным цветом он закрашен.

Общая схема создания картограммы с помощью пакета ggplot2 в среде R

Для построения картограммы необходимо осуществить такие шаги:

  1. Получить массив с географическими (пространственными) данными о границах районов.
  2. Получить массив с теми статистическими данными, распределение которых мы хотим отобразить на картограмме (плотность населения в нашем случае).
  3. Связать пространственные и статистические данные, чтобы программа знала, к какому куску плоскости относится данная статистика.
  4. Построить картограмму.

Получаем данные об административных границах районов Псковской области

Что такое [векторные] пространственные данные об административных границах? Это массив данных, в котором хранится информация о координатах точек, составляющих линию границы каждого района. Самый законно-бесплатный способ получить такой массив – это взять его из базы данных OpenStreetMap. В ней хранятся данные с административными границами нашего дорого Отечества (и всех других стран), федеральных округов, субъектов Федерации. По Псковской области также есть информация о границах районов и о границах некоторых волостей.

Спасибо активистам сообщества gis-lab.info, которые на регулярной основе “выдергивают” из всего громадного массива данных OpenStreetMap актуальные куски для стран, ранее входивших в СССР, и преобразуют их в разные форматы. Нам пригодятся данные по административным границам муниципальных районов России, доступные на сайте gis-lab.info в формате ESRI Shapefile. К сожалению, самая последняя версия этого файла не содержит информацию о границе Струго-Красненского района. Видимо, надо что-то исправлять в OpenStreetMap. Поэтому я в архиве нашёл версию данных от 1 января 2012 года, в которых граница ещё присутствует 🙂 Воспользуемся этим файлом.

# Скачиваем файл
download.file('http://gis-lab.info/data/yav/adm/20120101/adm6_district.7z', 'adm6_district.7z')

# Разархивируем. Системная команда для Linux.
# В Windows, наверно, следует прописать путь к архиватору 7z.
system('7z x adm6_district.7z')

# Читаем shape-файл.
library(rgdal)
# Первый параметр у readOGR - имя файла. Второй - название слоя.
shapes <- readOGR('adm6_district.shp', 'adm6_district')

Полученный массив содержит информацию по границам муниципальных районов всей России. Оставим только Псковскую область.

shapes <- shapes[shapes$ADM4_NAME=='Псковская область', ]

Как выяснилось при создании картограммы в ggplot2, функция geom_map не рисует дырки в полигонах, по крайней мере, я не нашёл способ это сделать. Поэтому выходит, что Псков и Великие Луки лежат на территории Псковского и Великолукского районов. И ещё один нюанс, что по умолчанию полигоны заливаются в той последовательности, в которой идут их идентификаторы. Скорее всего, есть более элегантный способ решить этот вопрос, а я пока иду "грязным" путём, заменив идентификаторы указанных городов в shape-массиве:

# При экспорте из OSM объекты получают идентификаторы со знаком "минус".
# Поэтому объект с любым положительным идентификатором будет отрисовываться после всех остальных.
shapes$OSM_ID[shapes$NAME=="Великие Луки"] <- 2
shapes$OSM_ID[shapes$NAME=="Псков"] <- 1

Функции из пакета ggplot2 любят (требуют) работать с данными в формате data.frame. Поэтому преобразуем массив класса 'sp' в массив класса data.frame:

# Преобразуем sp-объект в обычный data.frame, подходящий для ggplot2.
# Параметр region указывает, по какому полю группировать точки.
# В нашем случае каждый район обладает уникальным идентификатором OSM_ID из OpenStreetMap
shapesm <- fortify(shapes, region='OSM_ID')

Если вы захотите каждый район отметить своим названием, то функция geom_text из ggplot2 захочет, чтобы вы указали ей координаты тех мест, где ей нужно будет разместить текстовые строки с названиями. В общем случае, нам сгодятся и координаты центров районов, т.е. центроидов.

# получаем координаты центроида каждого района,
# чтобы разместить названия районов
# пользуемся функцией centroid.polygon из пакета maps
# вызываем её явно из пакета, т.е. с использованием :::, т.к.
# она внутренняя и не доступна в обычном пространстве имён
lp <- ddply(shapesm, .(id), maps:::centroid.polygon)
names(lp) <- c('OSM_ID', 'lpx', 'lpy')

Далее нам придётся бороться с ограничениями этого метода: метки Пскова и Лук накладываются на метки Псковского и Великолукского районов.

# Раздвигаем метки по вертикали.
# Координаты для сдвига получены опытным путём.
lp$lpy[lp$OSM_ID==-956303] <- 58
lp$lpy[lp$OSM_ID==1] <- 57.7
lp$lpy[lp$OSM_ID==-957758] <- 56.52
lp$lpy[lp$OSM_ID==2] <- 56.25

Итак, исходные пространственные данные для построения картограммы готовы. Осталось получить фактическую информацию о плотности населения.

Получаем данные о плотности населения районов Псковской области

Данные о населении районов и об их площади я взял из Википедии и сохранил в csv-файл.

# Читаем массив с данными по площади и населению районов
data <- read.table('/home/sas/1irr/data/regions_square_pop.csv', header=T, sep=';', dec='.')

# Считаем плотность
data$density <- data$population / data$square

# объединяем данные по плотности с координатами центроидов
data <- join(data, lp)

Дело остаётся за малым: построить график.

Строим график в ggplot2

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

# Функция по "прилизываю" графика.
polish_map <- function(x) {
  # Добавляем названия районов
  x <- x + geom_text(family='Courier', size=4, fontface='bold')
  # Удаляем линии сетки (промежуточные и основные)
  x <- x + theme(panel.grid.minor=element_blank(), panel.grid.major=element_blank())
  # Удаляем подписи значений на осях
  x <- x + scale_y_continuous(breaks=NULL) + scale_x_continuous(breaks=NULL)
  # Удаляем названия осей
  x <- x + ylab('') + xlab('')
  # Передвигаем легенду в верхний левый угол.
  # У Псковской области там как раз пустое пространство.
  x <- x + theme(legend.position=c(1, 1), legend.justification=c(1,1)
  # Можно залить фон графика белым: добавьте след.строку в параметры theme выше.
 # panel.background=element_rect(fill='white', colour='white')
               )
  return(x)
}

Рисуем график.

# Создаём переменную класса ggplot
# В ней используется массив data, 
# параметры x и y - это имена колонок из data, которые используются для определения
# горизонтальной и вертикальной позиции,
# map_id - по какой колонке происходит сопоставление данных и геообъектов.
# label - откуда брать текст.
m <- ggplot(data, aes(x=lpx, y=lpy, map_id = OSM_ID, label=shortname))

# Указываем, что в нашем графике данные будут визуализироваться в виде карты.
# При этом цвет заливки регионов карты определяется содержанием колонки density.
# Параметр colour указывает на то, что обрамление регионов должно присутствовать, но не 
# сопоставлено какой-либо переменной.
# Параметр map указывает, где хранятся данные о карте.
m <- m + geom_map(aes(fill=density), colour=1, map=shapesm) 

# Функция expand_limits() задаёт диапазон данных по осям. 
# Без этой функции края области будут обрезаны.
m <- m + expand_limits(x = shapesm$long, y = shapesm$lat)

# В параметре name задаётся название легенды. В нашем случае
# мы дополнительно используем функцию expression, чтобы добавить
# верхний индекс.
# В параметре trans задаём способ трансформации исходных данных - 
# поскольку у нас два города с высокой плотностью, а остальные - с 
# очень низкой, то применяем логарифмичекое преобразование, чтобы 
# сгладить разрыв.
# В labels указываем функцию round(), которая укругляет значения,
# отображаемые в легенде.
m <- m + scale_fill_gradient2(name = expression(paste("Человек/км"^2)), trans='log', labels=round)
m <- polish_map(m)
m <- m + ggtitle('Плотность населения районов\nПсковской области')
ggsave('density.png')

Powered by WordPress & Theme by Anders Norén