Данный документ представляет собой конспект главы “Base Plotting System” книги Роджера Пенга “Exploring Data With R”.

Работаем с таблицей airquality пакета datasets для R.

library(datasets)

Гистограмма

Функция hist().

hist(airquality$Ozone)

Можно сделать покрасивее и с подложкой, показывающей распределение точек.

hist(airquality$Ozone, col = "green", breaks = 50)
rug(airquality$Ozone)

Ящик с усами

“Ящики с усами” рисует функция boxplot(). В качестве аргумента — формула y-axis ~ x-axis. Переменная x должна быть дискретной, на каждое значение рисуется свой ящик. Если вместо формулы передается один вектор данных, рисуется один ящик.

Нарисуем ящики для уровня озона по месяцам.

pal <- colorRampPalette(c("yellow", "red"))
boxplot(Ozone ~ Month, data = airquality, col = pal(5))

Видно, что в июле и августе медианы выше, чем в остальные месяцы. Дисперсии в эти месяцы тоже выше. Такая ситуация (корреляция среднего и дисперсии) в целом характерна для данных об окружающей среде.

Диаграмма рассеяния

Диаграмма рассеяния (скаттерплот) рисуется с помощью функции plot().

with(airquality, plot(Wind, Ozone))

Базовый график с аннотациями

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

#Первоначальный график
with(airquality, plot(Wind, Ozone), type = "n")
#Добавим подпись к графику
title(main = "Ozone and Wind in New York City")
#Отметим синим точки, относящиеся к маю
with(subset(airquality, Month == 5), points(Wind, Ozone, col = "blue"))
#Остальные точки покрасим красным
with(subset(airquality, Month != 5), points(Wind, Ozone, col = "red"))
#добавим легенду
legend("topright", pch = 1, col = c("blue", "red"), legend = c("May", "Other Months"))

График с линейной регрессией

Часто бывает полезно сразу рисовать поверх скаттерплота линию линейной регрессии. Это делается с помощью функции abline()

with(airquality, plot(Wind, Ozone, pch = 20))
lm.fit <- lm(Ozone ~ Wind, data = airquality)
abline(lm.fit, lwd = 2, col = "green")

Множественные графики

Для того, чтобы нарисовать несколько графиков одновременно, используются параметры mfrow и mfcol. Оба задают количество рядов и количество графиков в каждом ряду. Если задан mfrow графики выводятся построчно, если mfcol — по столбцам.

par(mfrow = c(1, 2))
with(airquality, {
  plot(Wind, Ozone, main = "Ozone and Wind")
  plot(Solar.R, Ozone, main = "Ozone and Solar Radiation")
})

С помощью параметров mar и oma можно поиграться с полями между графиками и вокруг них.

#Три графика в один ряд, поля
par(mfrow = c(1,3), mar = c(4,4,2,1), oma = c(0,0,2,0))
with(airquality, {
  plot(Wind, Ozone, main = "Ozone and Wind")
  plot(Solar.R, Ozone, main = "Ozone and Solar Radiation")
  plot(Temp, Ozone, main = "Ozone and Temperature")
  #общая подпись для всех трех графиков
  mtext("Ozone and Weather in New York City", outer = TRUE)
})

Цветовые палитры пакета RColorBrewer

Посмотрим на все палитры пакета:

par(mfrow=c(1,1))
library(RColorBrewer)
display.brewer.all()

Изобразим какие-нибудь данные:

cols<- brewer.pal(3, "RdPu")
pal <- colorRampPalette(cols)
image(volcano, col = pal(20))

K-Means Clustering

Возьмем данные по ветру и озону из таблицы airquality, разобьем их на четыре кластера и красиво покрасим.

cols<-brewer.pal(4,"Set1")
kmeansObj <- kmeans(data.frame(airquality$Wind, airquality$Temp), 4)
with(airquality, plot(Wind, Temp, main = "Temperature and Wind", col = cols[kmeansObj$cluster], pch = 20))