Пакет 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).
PS. Если Вам интересно, какие еще графики можно строить в ggplot2, предлагаю посмотреть на этот список.
Диаграммы рассеяния – это график, позволяющий визуализировать связь между двумя количественными переменными. По осям откладываются значения каждой из двух переменных. Попробуем нарисовать диаграмму рассеяния для переменных отклонений оценки величины угла и длины отрезка.
Создадим эти переменные, вычтя из переменных оценки респондентами величины угла и длины отрезка их истинные значения.
df$length_diff <- df$length-22
df$angle_diff <- df$angle-18
Диаграмма рассеяния строится с помощью функции plot(x, y). Сразу подпишем оси:
plot(x = df$length_diff, y = df$angle_diff,
xlab = "Отклонение оценки длины отрезка", ylab = "Отклонение оценки величины угла")
Настроим вид графика. Изменим форму точки (список доступных символов можно найти в хелпе ?pch) и ее цвет. После этого добавим на график прямую, которая приближает линейную зависимость между переменными.
plot(x = df$length_diff, y = df$angle_diff,
xlab = "Отклонение длины отрезка", ylab = "Отклонение величины угла",
pch = 15, col = "red", ylim = c(-10, 45))
# adding line (first y, then x)
abline(lm(df$angle_diff ~ df$length_diff))
Линейная завсимость очень неустойчива к выбросам – тем значениям, которые лежат далеко от облака рассеяния. Обратите внимание, что это не те же самые выбросы, которые мы искали на ящиках с усами. К таким “двумерным” выбросам стоит относиться с осторожностью. Проиллюстрируем примером. На нашем графике присутствуют несколько значений, лежащих в левом верхнем углу. Попробуем удалить их и посмотреть, как изменится наклон прямой. Установим те же самые границы графика по оси OY, чтобы иметь возможность сравнивать графики.
temp <- subset(df, length_diff > -15)
plot(x = temp$length_diff, y = temp$angle_diff,
xlab = "Отклонение длины отрезка", ylab = "Отклонение величины угла",
pch = 15, col = "red", ylim = c(-10, 45))
abline(lm(temp$angle_diff ~ temp$length_diff))
Угол наклона значительно уменьшился.