Как объединить цвет, стиль линий и легенды формы в ggplot

Предположим, у меня есть следующий график в ggplot:

Он был сгенерирован с использованием кода ниже:

x <- seq(0, 10, by = 0.2)
y1 <- sin(x)
y2 <- cos(x)
y3 <- cos(x + pi / 4)
y4 <- sin(x + pi / 4)
df1 <- data.frame(x, y = y1, Type = as.factor("sin"), Method = as.factor("method1"))
df2 <- data.frame(x, y = y2, Type = as.factor("cos"), Method = as.factor("method1"))
df3 <- data.frame(x, y = y3, Type = as.factor("cos"), Method = as.factor("method2"))
df4 <- data.frame(x, y = y4, Type = as.factor("sin"), Method = as.factor("method2"))

df.merged <- rbind(df1, df2, df3, df4)

ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point()

Я хотел бы иметь только одну легенду, которая правильно отображает формы, цвета и типы линий (легенды взаимодействия (Тип, Метод) являются наиболее близкими к тому, что я хотел бы, но у них нет правильных форм / типов линий) ,

Я знаю, что если я использую scale_xxx_manual и укажу одинаковые метки для всех легенд, они будут объединены, но я не хочу устанавливать метки вручную:если есть новые методы или типы, я не хочу изменять свой кодхочу чего-то общего.

редактировать

Как указано в ответах ниже, есть несколько способов выполнить работу в данном конкретном случае. Все предлагаемые решения требуют вручную устанавливать типы и формы линий легенды, используяscale_xxx_manual functionс или сguides функция.

Однако предложенные решения все еще не работают в общем случае: например, если я добавляю новый фрейм данных в набор данных с новым методом «method3», он больше не работает, мы должны вручную добавить новый формы легенды и типы линий:

y5 <- sin(x - pi / 4)
df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3"))
df.merged <- rbind(df1, df2, df3, df4, df5)
override.shape <- c(16, 17, 16, 17, 16)
override.linetype <- c(1, 1, 3, 3, 4)

g <- ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point()
g <- g + guides(colour = guide_legend(override.aes = list(shape = override.shape, linetype = override.linetype)))
g <- g + scale_shape(guide = FALSE)
g <- g + scale_linetype(guide = FALSE)
print(g)

Это дает:

Теперь вопрос: как автоматически генерироватьoverride.shape а такжеoverride.linetype векторы?

Обратите внимание, что размер вектора равен 5, потому что у нас есть 5 кривых, в то время какinteraction(Type, Method) фактор имеет размер 6 (у меня нет данных для комбинации cos / method3)

Ответы на вопрос(5)

Ваш ответ на вопрос