data.Science(R)

Анализ данных, машинное обучение, и визуализация в R

ggplot2 — руководство по пакету

ggplot2 руководство

Что такое ggplot2?

ggplot2 — популярный графический пакет, полноценная и законченная система, наследующая идеи “Графической грамматики” (Grammar of Graphics, отсюда в названии gg).

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

  • Данные
  • Визуальная схема
  • Геометрический объект
  • Статистическая трансформация
  • Шкалы
  • Система координат
  • Регулировка позиции
  • Панели

Инсталляция и подготовка

Данные необходимо поместить в текущий рабочий каталог. Мы будем использовать открытую базу пищевой ценности продуктов сети ресторанов McDonalds. Руководство предполагает базовый опыт работы в R.

Стурктура ggplot2

Функция ggplot()  используется чтобы инициализировать базовую структуру графика, к которой мы слой за слоем добавляем элементы. Структура ggplot()  выглядит так:

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

Базовая настройка

Инициализация графика

Сначала, необходимо указать ggplot2 с каким набором данных (Data Frame) работать. Это осуществляется при помощи функции ggplot() , аргументом которой будет набор данных (массив), содержащий все необходимые данные для построения графика. В отличие от базовой графики  ggplot2  не работает с векторным представлением данных.

Затем мы зададим визуальную разметку (Aesthetic Mappings) при помощи функции aes() , которую можно расшифровать как aesthetic (в данном контексте можно условно понять как визуальное свойство геометрического объекта). В ggplot2 это означает “всё, что вы можете увидеть”. Например:

  • Позиция (координаты по оси x или y)
  • Цвет
  • Заливка (цвет внутри графика)
  • Форма (форма точек)
  • Тип линии
  • Размер

В данном примере нам потребуется указать разметку для x и y.

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

Наследование: геометрические объекты наследуют визуальную разметку из базового слоя, заданного при помощи ggplot() .

Добавление слоёв c геометрическими объектами (Geom) на график

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

  • Точки ( geom_point  для точечных диаграмм)
  • Линии ( geom_line  для временных рядов)
  • Текст ( geom_text  для текстовых аннотаций)
  • Прямоугольники ( geom_bar  для столбиковых диаграмм)
  • Полный список будет приведён ниже

Разные типы геометрических объектов принимают только определённый набор визуальных свойств. Смотрите страницу помощи geom  чтобы узнать какие схемы воспринимает тот или иной графический объект.

График должен иметь как минимум один геометрический объект. Его можно добавить при помощи оператора + .

ggplot

Мы добавили слой с геометрическим объектом geom_point  для точечной диаграммы (диаграмма рассеяния). Так как оси x и y были заданны при первоначальной настройке внутри ggplot()  этот слой унаследовал данные визуальные свойства. Вы также можете задавать визуальные свойства явно для каждого слоя внутри geom_ , как показано ниже:

ggplot1

Здесь мы указали для наших точек визуальное свойство “цвет”, основываясь на категориальной переменной Category. Легенда добавляется автоматически.

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

ggplot2

Важно не путать присваивание геометрическому объекту визуальных свойств и регулировку его фиксированных параметров: если бы мы просто хотели поменять размер всех точек, мы бы указали size  внутри вызова geom_point , а не внутри aes() .

ggplot3

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

Некоторые виды графиков (например точечная диаграмма) не требуют никаких преобразований: каждая точка получает координаты x и y и наносится на график в соответствии с их оригинальными значениями. Другие, такие как диаграммы размахов, гистограммы и линии регрессии требуют проведения определённых математических операций.

Добавим ещё один слой со статистическим преобразованием stat_smooth  для так называемой сглаженной линии тренда, включающую в себя 95% доверительные интервалы.

ggplot4

Каждая функция stat_  имеет свой геометрический объект geom  по умолчанию и наоборот, каждая функция geom_  ассоциируется с определённой статистикой stat .

Мы можем добавить в точности такой же слой и через функцию geom_smooth .

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

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

Благодаря этой тесной взаимосвязи в ggplot2  есть множество статистик и геометрических объектов с одним и тем же названием.

Изменение геометрического объекта и статистики, предложенных по умолчанию

Временами, статистическое преобразование, либо геометрический объект, предложенные по умолчанию – это не то, что вам нужно. Стандартный геометрический объект или статистику можно изменить задав соответствующие параметры geom  или stat :

ggplot5

ggplot6

Использование переменных, созданных при помощи stat_

Функции статистической трансформации могут создавать новые переменные (такие, как y-координаты сглаживающей линии), которые можно разметить на график через aes() . Некоторые статистические слои создают несколько различных величин, и вы можете выбрать какие из них вы хотите использовать в своём графике. Дабы избежать путаницы (например, если в наборе данных уже есть переменные с таким именем), созданные при помощи stat_  переменные окружаются двойными точками (..имя переменной..).

ggplot7

stat_summary()

Ещё одна полезная статистическая функция – это stat_summary() , позволяющая построить на графике сводные статистические показатели данных. stat_summary() применяет к данным функцию, переданную вами через fun.y , и затем наносит получившиеся значения на график, используя заданный геометрический объект. Например, мы можем построить график средних значений калорийности для каждой категории, в представлении столбиковой диаграммы.

ggplot8

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

Полный список возможных geom_  и stat_  функций

Основные настройки внешнего вида

Позиция (Position)

По разным причинам вы можете захотеть настроить то, каким образом геометрические объекты расположены относительно друг друга. Например, в качестве решения проблемы нахлёста точек друг на друга вы можете захотеть добавить некоторый случайный шум на график. Или при работе со столбиковой диаграммой, вам нужно решить, будут ли столбики расположены в ряд или уложены друг на друга.

  • identity
    Позиция по умолчанию в большинстве случаев. Геометрические объекты наносятся на график в соответствии с их фактическими значениями *x* и *y*
  • jitter
    Добавляет случайный шум к позициям *x* или *y*. Используется, как правило, для точек
  • stack
    Складывает геометрические объекты друг на друга. Позиция по умолчанию для столбиковых диаграмм
  • dodge
    Выстраивает объекты в ряд слева и справа друг от друга
  • fill
    Складывает объекты друг на друга расширяя или сужая их таким образом, чтобы заполнить пространство от 0 до 1. Позиция удобна для отображения пропорций

Построим график пропорций по категориям продуктов:

ggplot9

Здесь мы видим, что объекты уложены друг на друга в пропорции от 0 до 1. Но возможно мы захотим видеть каждый сегмент выстроенным рядом с другим в группированной столбиковой диаграмме? Мы можем сделать это указав position = "dodge" .

ggplot10

Системы координат (Coord)

В ggplot2  реализованны различные системы координат: Декартова и её разновидности, полярная система и картографическая проекция. Мы остановимся лишь на нескольких примерах практического применения функций типа coord_ .

Декартова система координат

Установленна по умолчанию для всех графиков и представляет собой плоскость из двух взаимоперпендикулярных прямых: оси x и y. Регулировка диапазона значений этих осей производится при помощи изменения аргументов xlim  и ylim  и позволяет приблизить любой участок графика:

ggplot4

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

g1 + coord_cartesian(xlim = c(0, 70), ylim = c(0, 2500)) # Выброс остался за пределами отображения

ggplot11

Круговая диаграмма

Для построения круговой диаграммы в ggplot  нужно всего лишь применить к диаграмме из примера с пропорциями слой с полярными координатами:

ggplot12

Метки (Labels)

Теперь, когда основные части нанесены на график, вы можете добавить заголовок и названия для осей. Это можно сделать при помощи слоя labs , предназначенного для задания меток.

Начнём с построения точечной диаграммы для распределения содержания жира в продуктах по уровню холестерина и категории продукта:

ggplot13

Метки приобрели желаемый вид, однако, манипуляции с цветом и размером меток осуществляются при помощи тем, которые будут рассмотрены ниже.

Тонкая настройка внешнего вида графика

Шкалы (Scales)

Контроль визуальной разметки (Mapping)

Визуальная схема (т.е. aes() ) только говорит, что переменная должна быть размечена на график, но не говорит как. Например, когда мы применяем к переменной разметку типа форма ( aes(shape = ) ) мы не указываем, какая именно форма должна быть применена. Таким же образом aes(color = )  не задаёт конкретный цвет. Назначение цвета\формы\размера и т.д. для разметки делается при помощи изменения соответствующей шкалы ( scale ). Шкалы предоставляют вам более тонкий контроль над визуальной схемой графика.

ggplot2  включает в себя следующие шкалы:

  • Позиция
  • Цвет и заливка
  • Размер
  • Форма
  • Тип линии

Шкалы модифицируются при помощи серии функций, имеющих вид scale_<визуальное свойство>_<тип переменной> .

Общие аргументы шкал

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

  • name
    Первый аргумент, задает ось или название легенды
  • limits
    Минимум и максимум шкалы
  • breaks
    Точки на шкале, где должны появится метки
  • labels
    Метки для каждого разрыва

Специфические функции шкал могут иметь дополнительные аргументы, например функция scale_color_continuous имеет аргументы low  и high , чтобы задать цвет на верхней и нижней границах шкалы.

Примеры модификации шкал

Практически все настроено, осталось только изменить легенду и перевести метки на русский язык. Настройка легенды немного сложнее. Если ваша легенда – это аттрибут color  и она основывается на категориальной переменной – вы должны задать необходимые аргументы, используя функцию scale_color_discrete() , где модификатор color происходит от аттрибута цвета, а модификатор discrete  вытекает из того, что легенда основывается на факторной переменной.

Вернёмся к графику распределения содержания жира в продуктах по уровню холестерина и категории:

Мы хотим перевести метки для шкалы x, изменить разрывы легенды и их обозначения, а так же
поменять цвет для верхних и нижних значений легенды.

ggplot14

Если легенда отражает аттрибут формы, основанный на дискретной переменной, вы должны изменить модификаторы функции на scale_shape_discrete() , а если вы используете непрерывную переменную: scale_shape_continuous() .

Темы (Themes)

Система тем в ggplot2  оперирует с элементами графика, не являющимися данными, такими как:

  • Подписи осей
  • Фон графика
  • Фон меток в панелях
  • Внешний вид легенды

ggplot15

Переопределение темы по умолчанию

Любые специфические элементы темы могут быть переопределены через функцию theme() . Например, регулировка размера и цвета меток осуществляется настройкой параметров plot.title , axis.text.x  и axis.text.y . Они должны быть заданны внутри element_text() . Если вы хотите удалить эти элементы, задайте их как element_blank() .

ggplot16

Все опции задокументированны в ?theme .

Панели (Facets)

Панелирование в ggplot2  – это жаргонное название для разбиения на подграфики. Идея в том, чтобы создать отдельные графики для подмножеств данных.  Есть два способа разбиения:

  • facet_wrap()  определяет подмножества как уровни одной группирующей переменной
  • facet_grid()  определяет подмножества как пересечение двух группирующих переменных

Пример:

ggplot17

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

Мы можем исправить недостатки предыдущего графика разбив его по уровням переменной Category, вместо того, чтобы помечать каждый из этих уровней разным цветом:

ggplot18

Сохранение графика в файл

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

Дополнительная информация

  • Подробное описание пакета на русском языке можно найти в книге С.Э. Мастицкого “Визуализация данных с помощью ggplot2”
  • Для быстрой сверки можно использовать перевод шпаргалки от RStudio
  • ggThemeAssist – аддон для RStudio, позволяющий редактировать графики при помощи графического интерфейса