Группа ggplot по одной категориальной переменной и цвет второй - программирование

Группа ggplot по одной категориальной переменной и цвет второй

По сути, я хотел бы создать первый график, показанный ниже в R, используя ggplot, но с обоими объектами на одном графике (без переноса фасетов).

Рассмотрим минимальный пример, который имитирует мою структуру данных:

library(reshape2)
library(ggplot2)
x <- seq(1, 5, length = 100)
y <- replicate(10, sin(2 * pi * x) + rnorm(100, 0, 0.3), "list")
z <- replicate(10, sin(2 * pi * x) + rnorm(100, 5, 0.3), "list")
y <- melt(y)
z <- melt(z)
df <- data.frame(x = y$Var1, rep = y$Var2, y = y$value, z = z$value)
dat <- melt(df, id = c("x", "rep"))

Я могу построить это с помощью

ggplot(dat) + geom_line(aes(x, value, group = rep, color = variable), 
    alpha = 0.3) + facet_wrap(~variable)

и получить


(источник: carlboettiger.info)

Но если я попытаюсь отбросить перенос фасетов, я подумаю, что он должен сгруппироваться по цвету и переменной, но вместо этого данные будут разбиты неправильно, что приведет к бессмыслице:


(источник: carlboettiger.info)

4b9b3361

Ответ 1

Проблема в том, что эстетика group отменяет стандартные протоколы группировки - она ​​не включена во взаимодействие всех дискретных переменных на графике, описанном в ?group.

Итак, чтобы заставить ваш сюжет работать без огранки, вам нужно вручную указать взаимодействие

ggplot(dat) + geom_line(aes(x, value, group = interaction(rep,variable), color = variable), alpha = 0.3) 

enter image description here

Чтобы переопределить альфа-значение в эстетике, используйте guide_legend(override.aes = ...)). Эта информация может быть найдена по ссылкам в ?guides и, в частности, ?guide_legend

например,

ggplot(dat) + geom_line(aes(x, value, group = interaction(rep,variable), color = variable), 
                           alpha = 0.3) + 
  scale_colour_discrete(guide = guide_legend(override.aes = list(alpha = 1)))

enter image description here

Ответ 2

Вы можете вставить rep и переменную группу:

ggplot(dat) + geom_line(aes(x, value, group = paste(variable, rep), color = variable), 
                    alpha = 0.3)