Press "Enter" to skip to content

Что такое грамматика графики 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


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

4 Comments

Your email address will not be published. Required fields are marked *

Защита от спама *