Проблемы при использовании 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, потому что у меня есть много переменных для построения графика.

506   2  

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

    Ничего не найдено.