Файлы для работы можно скачать здесь.

Прежде чем переходить к более сложным и красивым графикам и работе с ggplot2, еще немного поговорим о стандартных графиках. Возьмем базу данных по выборам 2011 года (с курса “Анализ политологических данных в пакете STATA”).

library(foreign)
df <- read.dta("C:/Users/AllaT/Desktop/Rclass/elections_reg.dta") # загружаем базу
df <- na.omit(df) # удалим пропущенные значения
View(df)

Диаграммы рассеяния (scatterplots)

Допустим, мы хотим посмотреть на связь между переменными “процент голосов за”Единую Россию“” и “среднедушевой доход в регионе”

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 ")

Матрица диаграмм рассеяния (scatterplot matrix)

Иногда в ходе предварительного анализа бывает нужно посмотреть на связь “всего со всем”. Для этого удобно использовать матрицу графиков.

Построим диаграммы рассеяния для процентов голосов за разные партии.

pairs(df[3:7], col = col) # выбираем столбцы 3-7, чтобы не прописывать все переменные

Как можно заметить, матрица графиков симметрична. Поэтому достаточно вывести графики ниже главной диагонали:

pairs(df[3:7], col = col, upper.panel=NULL) 

# для верхней части, соответственно lower.panel=NULL

Теперь можем переходить к пакету ggplot2 и более продвинутым графикам.

Графики и пакет ggplot2

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

Сначала необходимо установить сам пакет ggplot2.

install.packages('ggplot2')
library(ggplot2)

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).

ggplot2: графики плотности

# geom_density - только функции плотности
ggplot(df, aes(x = ER, colour = pop)) + geom_density()

Можем добавить заливку. Часто это помогает отразить различия распределений более наглядно.

# добавили аргумент fill
ggplot(df, aes(x = ER, fill = pop)) + geom_density(alpha = .3)

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

ggplot2: “ящики с усами”

Построим “ящики с усами” (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"))

ggplot2: диаграммы рассеяния

Напоследок построим диаграмму рассеяния (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 - ромб.

Остальные графики, связанные с корреляциями, регрессиями и доверительными интервалами, обсудим, когда будем разбирать регрессии.