#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. Спасибо, что указали на это решение. Это имеет смысл просто перейти по списку. На самом деле у меня есть печатная копия книги рядом с моим столом … но я прошел через все это. 🙁 Так много нужно узнать.