вторник, 17 ноября 2015 г.

Прокачиваем ggplot2: пакеты gridExtra, cowplot, ggthemes и ggfortify

Достаточно часто возникает необходимость аккуратно разместить несколько графиков рядом, скомпоновав из них целостное изображение. В случае однотипных графиков можно использовать функцию facet_grid() из пакета ggplot2 либо аналогичные возможности пакета lattice. Если нужно разместить на одной странице несколько разных графиков, можно использовать базовые возможности R в виде параметра mfrow, например, 4 графика равного размера размещаются рядом при помощи par(mfrow=c(2,2)). Ниже рассмотрены более продвинутые реализации, работающие совместно с ggplot2.

Пакет gridExtra

Данный пакет снабжен достаточно подробной документацией. Основные возможности: комбинация рисунков, представленных объектами ggplot; комбинация таблиц в графическом виде; комбинация объектов разных типов, например таблиц, графиков и текста; работа с графическими примитивами. Приведу пару примеров с минимальным набором опций и небольшими комментариями.

Нарисуем 4 графика, один из которых пусть будет "фасеточным":

p1 <- qplot(mpg, wt, data=mtcars, colour=cyl)
p2 <- qplot(mpg, data = mtcars) + ggtitle("title")
p3 <- qplot(mpg, data = mtcars, geom = "dotplot")
p4 <- p1 + facet_wrap(~carb, nrow=1) + theme(legend.position="none") +
  ggtitle("facetted plot")


Все эти графики можно поместить на одну страницу при помощи следующего фрагмента кода:
grid.arrange(p1, p2, p3, p4, 
             widths = c(2, 1, 1), # ширина столбцов
             layout_matrix = rbind(c(1,2,3), 
                                   c(4,4,4)))

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

Добавить таблицу к графику можно следующим образом:
grid.arrange(tableGrob(mtcars[1:4, 1:4]), p2, 
             ncol=2, widths=c(1.5, 1), clip=FALSE)

Результат:


Больше примеров можно найти в официальной документации.

Пакет cowplot

Очень похож по своим возможностям на предыдущий. Базовый вариант использования с метками и выравниванием:
plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + 
  geom_point(size=2.5)
plot.diamonds <- ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar() +
  theme(axis.text.x = element_text(angle=70, vjust=0.5))
plot_grid(plot.mpg, plot.diamonds, labels = c('A', 'B'), align = 'h')

Такое представление комбинированных графиков (с буквенными метками для каждого элемента) часто можно видеть в научных публикациях.

Выравнивание обычных и "фасеточных" графиков имеет свои особенности, описанные в руководстве.

Очень удобно реализованы вложенные комбинации графиков:
plot.mpg <- ggplot(mpg, aes(x = cty, y = hwy, colour = factor(cyl))) + 
    geom_point(size=2.5)
plot.diamonds <- ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar() +
    theme(axis.text.x = element_text(angle=70, vjust=0.5))
plot.iris <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
    geom_point() + facet_grid(. ~ Species) + stat_smooth(method = "lm") +
    background_grid(major = 'y', minor = "none") + 
    panel_border() 
 
bottom_row <- plot_grid(plot.mpg, plot.diamonds, 
                        labels = c('B', 'C'), align = 'h', 
                        rel_widths = c(1, 1.3))
plot_grid(plot.iris, bottom_row, labels = c('A', ''), 
          ncol = 1, rel_heights = c(1, 1.2))

В общем, очень круто получается - и всего в пару дополнительных строк кода по сравнению с отдельными графиками.

В основе всей этой красоты, помимо собственно ggplot2, лежат пакеты grid и gtable.

Пакет ggthemes - дополнительные темы для ggplot2

Содержит большое количество тем и отдельных графических элементов. По-настоящему приятных вариантов немного, но чего стоит возможность нарисовать картинку "как в Excel"! Создание и использование тем открывает возможность для применения языка R в такой не очень традиционной для него области, как инфографика (пример).

Пакет ggfortify

Предназначение этого пакета - визуализация данных из различных объектов, например, содержащих результаты подгонки общей или обобщенной линейной модели. Документация содержит большое количество примеров, ниже представлен один из них.
m <- lm(Petal.Width ~ Petal.Length, data = iris) 
autoplot(m, which = 1:6, ncol = 3, label.size = 3)

См. также: GGallyggdendroggRandomForestsggmcmc.

Комментариев нет:

Отправить комментарий