Проблемы при использовании ggplot AES string, group и linetype
Допустим, у меня есть такой набор данных:
x <- rnorm(1000)
y <- rnorm(1000, 2, 5)
line.color <- sample(rep(1:4, 250))
line.type <- as.factor(sample(rep(1:5, 200)))
data <- data.frame(x, y, line.color, line.type)
Я пытаюсь построить группу переменных x и y взаимодействием линий.тип и линия.цвет. Кроме того, я хочу указать тип линии с помощью line.введите и цвет с помощью линии.цвет. Если я напишу это:
ggplot(data, aes(x = x, y = y, group = interaction(line.type, line.color), colour = line.color, linetype = line.type)) + geom_line()
Это работает, но если я попытаюсь использовать aes_string, как это:
interact <- c("line.color", "line.type")
inter <- paste0("interaction(", paste0('"', interact, '"', collapse = ", "), ")")
ggplot(data, aes_string(x = "x", y = "y", group = inter, colour = "line.color", linetype = "line.type")) + geom_line()
Я получаю ошибку:
Error: geom_path: If you are using dotted or dashed lines, colour, size and linetype must be constant over the line
Что я делаю не так? Мне нужно использовать строку aes_string, потому что у меня есть много переменных для построения графика.
2 ответов:
Вы были почти там, определяя
inter <- paste0("interaction(", paste0('"', interact, '"', collapse = ", "), ")")Однако, чтобы
aes_stringработал, вам нужно передать символьную строку того, что работало бы, если бы вы вызывалиaes, то есть вам не нужно иметь аргументы внутриinteractionв виде строк. Вы хотите создать строку"interaction(line.color, line.type)". Поэтомуinter <- paste0('interaction(', paste0(interact, collapse = ', ' ),')') # or # inter <- sprintf('interaction(%s), paste0(interact, collapse = ', ')) # the result being inter ## [1] "interaction(line.color, line.type)" # and the following works ggplot(data, aes_string(x = "x", y = "y", group = inter, colour = "line.color", linetype = "line.type")) + geom_line()
Оказывается, я ошибся по нескольким пунктам в своих комментариях выше. Это, по-видимому, работает:
data$inter <- interaction(data$line.type,data$line.color) ggplot(data, aes_string(x = "x", y = "y", group = "inter",colour = "line.color",linetype = "line.type")) + geom_line()(я был совершенно неправ относительно графика, указывающего различные цвета и т. д. В пределах одной пунктирной / пунктирной линии.)
Я воспринимаю это как небольшое подтверждение того, что полагаться на разбор кода
interactionвнутриaes_string()вообще плохая идея. Я предполагаю, что есть просто небольшая ошибка в попытке ggplot разобрать то, что вы даетеaes_string()в сложных случаях, что заставляет его оценивайте вещи в таком порядке, чтобы это выглядело так, как будто вы просите различную эстетику по пунктирным/пунктирным линиям.
Comments