Press "Enter" to skip to content

Что такое грамматика графики 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: название графика, осей, легенд

3 Comments

  1. Strffs
    Strffs 2022-01-23

    Спасибо большое

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

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