Графики в ggplot2

Пакет ggplot2 представляет огромное количество возможностей для гибкой визуализации данных в R.

Установим и загрузим пакет:

install.packages("ggplot2")
library(ggplot2)

Продолжаем работать с базой данных с прошлых занятий.

df <- read.csv2("http://math-info.hse.ru/f/2018-19/psych-ms/data/psych_survey.csv")

Синтаксис

Синтаксис пакета ggplot2 несколько отличается от базового редактора графиков в R, с которым мы уже познакомились. Для того, чтобы нарисовать график с помощью ggplot2, необходимо сначала задать структуру графика, прописав, с какой базой данных Вы работаете и какие переменные должны быть отложены по осям: ggplot(data, aes(x, y)). Затем начинается работа с графическими объектами, которые слоями накладываются на заданную структуру. Слои добавляются с помощью знака +.

Гистограммы

Чтобы построить гистограмму, требуется указать переменную, для которой она строится, и добавить слой geom_histogram().

ggplot(data = df, aes(x = math)) + geom_histogram()   
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 17 rows containing non-finite values (stat_bin).

Настройки гистограммы прописываются в качестве аргументов к слою geom_histogram(). В отличие от базовой гистограммы, мы можем указать шаг деления в аргументе binwidth. Цвета гистограммы настраиваются аргументами fill (заливка) и color (цвет линий).

ggplot(data = df, aes(x = math)) + 
  geom_histogram(binwidth = 5, 
                 fill = "salmon", color = "black") 
## Warning: Removed 17 rows containing non-finite values (stat_bin).

Выставим деления на оси OX с шагом в 10 баллов. Подпишем оси, добавляя слои xlab() и ylab().

ggplot(data = df, aes(x = math)) + 
  geom_histogram(binwidth = 5, 
                 breaks = seq(50, 100, by = 10),
                 fill = "salmon", color = "black") +
  xlab("Балл ЕГЭ по математике") + ylab("Количество")
## Warning: Removed 17 rows containing non-finite values (stat_bin).

ggplot2 позволяет удобно строить гистограммы для подгрупп наблюдений, не создавая дополнительных датафреймов. Для того, чтобы нарисовать несколько гистограмм на основании группирующей переменной, требуется добавить слой facet_wrap(~group_var). Обратите внимание, что группирующая переменная прописывается после знака тильды.

В качестве группирующей переменной возьмем фактор, который указывает, какой любимый предмет выбрал студент: естественно-научный, гуманитарный либо ни один из предлагавшихся. Так как в этой переменной есть пропуски, удалим их внутри ggplot(data = subset(df, subject2 != "NA", ...).

ggplot(data = subset(df, subject2 != "NA"), aes(x = math)) + 
  geom_histogram(binwidth = 5, 
                 breaks = seq(50, 100, by = 10),
                 fill = "salmon", color = "black") +
  xlab("Балл ЕГЭ по математике") + ylab("Количество") +
  facet_wrap(~subject2)
## Warning: Removed 16 rows containing non-finite values (stat_bin).

Мы можем изменить значения по оси OY для того, чтобы графики были сравнимы: ведь сейчас три группы имеют разный объем. Попросим R отложить по оси OY не количество наблюдений, а плотность, чтобы площадь под каждым графиком была равна 1.

ggplot(data = subset(df, subject2 != "NA"), aes(x = math)) + 
  geom_histogram(aes(y =..density..), 
                 binwidth = 5, 
                 breaks = seq(50, 100, by = 10),
                 fill = "salmon", color = "black") +
  xlab("Балл ЕГЭ по математике") + ylab("Количество") +
  facet_wrap(~subject2)
## Warning: Removed 16 rows containing non-finite values (stat_bin).