добавление различных слоев в ggplots

#r #ggplot2

#r #ggplot2

Вопрос:

При очистке своего кода я начинаю использовать переменные для добавления общих элементов к моим графикам (например, цветовые гаммы, заголовки, …). Я заметил , что в общем случае я могу добавлять отдельные слои либо явно , либо в качестве переменных к базовому графику с помощью .

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

Однако, по-видимому, существуют комбинации слоев, которые каким-то образом «несовместимы». Например , объединение scale_x_continuous and scale_color_viridis_d в одну переменную выдает ошибку Cannot add ggproto objects together. Did you forget to add this object to a ggplot object? , даже если оба слоя были объединены без проблем в переменной , которая также содержала ggtitle and scale_linetype_manual .

Что делает эти различные метки несовместимыми? И какие слои добавляются в качестве клея, так сказать, который теперь позволяет комбинировать эти несовместимые слои?

 library(tidyverse)
data <- mtcars
data$model <- row.names(data)
data$carb <- as.factor(data$carb)
data$cyl <- as.factor(data$cyl)

#// basic plot
plot <- ggplot(data)  
    geom_point(aes(x = mpg, y = hp, color = carb))  
    geom_smooth(aes(x = mpg,  y = hp, linetype = cyl), se = FALSE)

#// add layers explicitly
plot   ggtitle("Title")
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
 

 plot   scale_linetype_manual(name = "Cylinder", values = c("4" = "dashed", "6" = "solid", "8" = "dotted")) 
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
 

 plot   scale_x_continuous(breaks = seq(from = 5, to = 50, by = 2.5))
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
 

 plot   scale_color_viridis_d(begin = 1, end = 0, alpha = 1, direction = 1, na.value = "gray")
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
 

 #// add individual layers as variables
title          <- ggtitle("Title")
scale_linetype <- scale_linetype_manual(name = "Cylinder", values = c("4" = "dashed", "6" = "solid", "8" = "dotted")) 
scale_x        <- scale_x_continuous(breaks = seq(from = 5, to = 50, by = 2.5))
scale_col      <- scale_color_viridis_d(begin = 1, end = 0, alpha = 1, direction = 1, na.value = "gray")
plot   title   scale_linetype   scale_x   scale_col
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
 

 #// combine layers to add and then add to plot
combo <- title   scale_col   scale_linetype   scale_x
plot   combo
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
 

 #// combining these two layers doesn't work
combo <- scale_col   scale_x
#> Error: Cannot add ggproto objects together. Did you forget to add this object to a ggplot object?
 

Создано 2021-01-15 пакетом reprex (версия 0.3.0)

Просто код для упрощения копирования / вставки.

 library(tidyverse)
data <- mtcars
data$model <- row.names(data)
data$carb <- as.factor(data$carb)
data$cyl <- as.factor(data$cyl)

#// basic plot
plot <- ggplot(data)  
    geom_point(aes(x = mpg, y = hp, color = carb))  
    geom_smooth(aes(x = mpg,  y = hp, linetype = cyl), se = FALSE)

#// add layers explicitly
plot   ggtitle("Title")
plot   scale_linetype_manual(name = "Cylinder", values = c("4" = "dashed", "6" = "solid", "8" = "dotted")) 
plot   scale_x_continuous(breaks = seq(from = 5, to = 50, by = 2.5))
plot   scale_color_viridis_d(begin = 1, end = 0, alpha = 1, direction = 1, na.value = "gray")

#// add individual layers as variables
title          <- ggtitle("Title")
scale_linetype <- scale_linetype_manual(name = "Cylinder", values = c("4" = "dashed", "6" = "solid", "8" = "dotted")) 
scale_x        <- scale_x_continuous(breaks = seq(from = 5, to = 50, by = 2.5))
scale_col      <- scale_color_viridis_d(begin = 1, end = 0, alpha = 1, direction = 1, na.value = "gray")
plot   title   scale_linetype   scale_x   scale_col

#// combine layers to add and then add to plot
combo <- title   scale_col   scale_linetype   scale_x
plot   combo

#// combining these two layers doesn't work
combo <- scale_col   scale_x
 

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

1. На самом деле combo <- title scale_col scale_linetype scale_x тоже не работает. Это просто NULL. Разница в этом случае заключается в том, что title это класс labels . Добавление ggproto объекта в title возвращает NULL , который затем добавляется к следующему ggproto объекту … , т. Е. Здесь вы не добавляете ggproto объекты. Но в итоге NULL получается. Если вы измените порядок, например, поместите заголовок в конец, вы столкнетесь с той же проблемой.

2. Большое спасибо, что указали на это. Я даже не смотрел на графики должным образом, чтобы увидеть, отображал ли он то, что должен был отображать! Я просто предположил, что это сработало, поскольку оно не выдало ошибку. Кажется, что самое безопасное, что можно сделать, это просто добавить каждый отдельный объект как отдельную переменную — если я не могу понять / посмотреть, какой из объектов является объектом ggproto, а какой нет.

3. Вместо того, чтобы помещать слои в отдельные переменные, вы могли бы просто поместить их в список. Вы всегда можете добавить список слоев в ggplot. С этой целью я рекомендую взглянуть на главу 19 книги ggplot2. См. ggplot2-book.org/programming.html#multiple-components .

4. Спасибо, что указали на это решение. Это имеет смысл просто перейти по списку. На самом деле у меня есть печатная копия книги рядом с моим столом … но я прошел через все это. 🙁 Так много нужно узнать.