Файлы для работы можно скачать здесь.
Прежде чем переходить к более сложным и красивым графикам и работе с ggplot2, еще немного поговорим о стандартных графиках. Возьмем базу данных по выборам 2011 года (с курса “Анализ политологических данных в пакете STATA”).
library(foreign)
df <- read.dta("C:/Users/AllaT/Desktop/Rclass/elections_reg.dta") # загружаем базу
df <- na.omit(df) # удалим пропущенные значения
View(df)
Допустим, мы хотим посмотреть на связь между переменными “процент голосов за”Единую Россию“” и “среднедушевой доход в регионе”
plot(df$ER, df$dohod_pc) # просто указываем две переменные
Как можно заметить, особой красотой этот график не отличается (да и сильной связи между переменными тоже не наблюдается). График скучный. Что мы можем сделать? Во-первых, подписать оси.
plot(df$ER, df$dohod_pc, xlab = "Income per capita",
ylab = "Percentage of votes: ER")
Во-вторых, мы можем добавить цвета, причем вполне содержательно. Допустим, мы хотим разделить регионы на малонаселенные и густонаселенные (поделить по переменной “население”: если выше среднего - густонаселенный регион, если меньше - малонаселенный). Такое резкое деление по среднему значению, конечно, странное, но для примера подойдет.
df$pop <- rep(NA, length(df$ER)) # создаем "пустую" переменную и заполняем
for (i in 1:length(df$pop)) {
if (df$naselenie[i]>mean(df$naselenie)) df$pop[i] <- 1 else df$pop[i] <- 0
}
Зададим цвета (вектор цветов) и построим график. Пусть красным цветом будут отмечены малонаселенные регионы, синим – густонаселенные.
col <- c("red", "blue")[factor(df$pop)] # устанавливаем цвета по группирующей переменной
plot(log(df$dohod_pc), df$ER, col = col, lwd = 2, xlab = "Income per capita",
ylab = "Percentage of votes for ER ")
Иногда в ходе предварительного анализа бывает нужно посмотреть на связь “всего со всем”. Для этого удобно использовать матрицу графиков.
Построим диаграммы рассеяния для процентов голосов за разные партии.
pairs(df[3:7], col = col) # выбираем столбцы 3-7, чтобы не прописывать все переменные
Как можно заметить, матрица графиков симметрична. Поэтому достаточно вывести графики ниже главной диагонали:
pairs(df[3:7], col = col, upper.panel=NULL)
# для верхней части, соответственно lower.panel=NULL
Теперь можем переходить к пакету ggplot2 и более продвинутым графикам.
с помощью пакета ggplot2 можно строить более продвинутые графики с учетом многих параметров, как с точки зрения функциональности графика, так и с точки зрения его дизайна.
Сначала необходимо установить сам пакет ggplot2.
install.packages('ggplot2')
library(ggplot2)
Для начала построим простую гистограмму, чтобы понять, как устроены функции в пакете ggplot2.
# сначала указываем базу и переменную, затем + тип графика
# вообще все дополнительные параметры (слои) будут указываться через +
# binwidth - ширина столбца
ggplot(df, aes(x = ER)) + geom_histogram(binwidth = 4)
Поменяем цвета:
# colour - цвет контура, fill- цвет заливки
ggplot(df, aes(x = ER)) + geom_histogram(binwidth = 4,colour = "black",
fill = "greenyellow")
Пока получили обычную гистограмму. Добавим что-то более интересное - линию, которая будет отмечать среднее значение переменной на гистограмме.
# geom_vline - вертикальная линия
# xintercept - где пересекаем ось x
ggplot(df, aes(x = ER)) +
geom_histogram(binwidth = 4, colour = "black", fill = "greenyellow") +
geom_vline(aes(xintercept = mean(ER)),
color = "red", linetype = "dashed", size = 1)
Аналогичные действия можем проделать, чтобы провести горизонтальную линию. Например, отчертим частоту равную 5.
# меняем на hline - горизонтальная линия
# yintercept - где пересекаем ось y
ggplot(df, aes(x = ER)) +
geom_histogram(binwidth = 4, colour = "black", fill = "greenyellow") +
geom_hline(aes(yintercept = 5),
color = "red", linetype = "solid", size = 1)
Как можно заметить, мы заодно поменяли и тип линии. Для справки – типы линий: “blank” (белая пустая), “solid” (обычная, плотная), “dashed” (пунктир), “dotted” (точечная), “dotdash” (точка-тире), “longdash”(длинный пунктир), и “twodash”(короткий и длинный пунктир).
Допустим, теперь мы хотим сравнить распределение голосов за “Единую Россию” в густонаселенных и малонаселенных регионах (согласно нашему немного странному делению). Для этого построим две гистограммы на одном графике и отметим средние значения переменных.
library(plyr) # используем для расчета средних по группам
df$pop <- as.factor(df$pop) # перекодируем переменную - нужно, чтобы R воспринимал
# бинарную переменную pop как текстовую, как фактор (не как количественную)
Создадим маленькую базу со средними:
cdat <- ddply(df, "pop", summarise, ER.mean = mean(ER))
# можем на нее посмотреть
cdat
## pop ER.mean
## 1 0 49.62274
## 2 1 49.43000
Теперь построим гистограммы:
ggplot(df, aes(x = ER, fill = pop)) +
geom_histogram(binwidth = 3, alpha = .5, position = "identity") +
geom_vline(data = cdat, aes(xintercept = ER.mean, colour = pop),
linetype = "dashed", size = 1)
Не очень наглядно в данном случае. Поэтому лучше изобразить просто графики плотности распределения (density plots).
# geom_density - только функции плотности
ggplot(df, aes(x = ER, colour = pop)) + geom_density()
Можем добавить заливку. Часто это помогает отразить различия распределений более наглядно.
# добавили аргумент fill
ggplot(df, aes(x = ER, fill = pop)) + geom_density(alpha = .3)
Как можно заметить, по умолчанию цвета при разбиении - голубой и розовый. Но, разумеется, цвета можно поменять. Рассмотрим это на примере “ящиков с усами”.
Построим “ящики с усами” (boxplots) для переменной “процент голосов за Единую Россию” для двух групп регионов:
# geom_boxplot - отвечает за тип графика
# x - переменная, по которой производится разбиение
# y - переменная, для которой строим boxplot
ggplot(df, aes(x = pop, y = ER, fill = pop)) + geom_boxplot()
Теперь можем поменять цвета и сделать осмысленной легенду:
# scale_fill_manual - оформление легенды
# name - заголовок легенды
# values - цвета в легенде (и заодно на графике)
# labels - подписи к цветам в легенде
ggplot(df, aes(x = pop, y = ER, fill = pop)) + geom_boxplot() +
scale_fill_manual(name = "population", values = c("yellow", "green"), labels = c("0" = "low", "1" = "high"))
Напоследок построим диаграмму рассеяния (scatterplot).
# geom_point - тип графика, параметры для маркеров (точек)
# shape - вид маркера
# size - размер
ggplot(df, aes(x = ER, y = yavka, color = pop)) + geom_point(shape = 17, size = 3)
Основные формы для маркеров (точек):
Без заливки
shape=0 - квадрат,
shape=1 - круг,
shape=2 - треугольник,
shape=3 - крест,
shape=4 - крест (диагональный),
shape=5 - ромб.
С заливкой
shape=15 - квадрат,
shape=16 - круг,
shape=17 - треугольник,
shape=18 - ромб.
Остальные графики, связанные с корреляциями, регрессиями и доверительными интервалами, обсудим, когда будем разбирать регрессии.