/ / Створення легенди ggplot з кольором та типом ліній на основі двох змінних - ggplot2, legend

Створення легенди ggplot з кольором і типом лінії на основі двох змінних - ggplot2, легенда

В Створення легенди ggplot як кольору, так і форми є спосіб поєднати форму і колір, але заснований на одній змінної. Цікаво, якщо це можливо, якщо змінна розбивається на дві змінні.

Hier - це дані тесту:

(x <- data.frame(time =rep(1:5,4)
, sex = rep(c("m","f"), each=5)
, val_type = rep(c("obs","fit"),each=10)
, val = rep(1:4,each=5)*rep(1:5,4)
)
)

Щоб показати, як я хочу мати легенду, я поєдную дві змінні:

x$sv <- paste(x$sex,x$val_type,sep="-")

Ось ggplot з однією змінною:

ggplot(data=x, aes(x=time, y=val, linetype=sv, col=sv)) +
geom_line() +
scale_colour_manual(name = ""
, values=c("red","red","blue","blue")
, labels=c("Female fitted","Female observed"
,"Male fitted","Male observed")
) +
scale_linetype_manual(name = ""
, values=c(1,2,1,2)
, labels=c("Female fitted","Female observed"
,"Male fitted","Male observed")
)

а ось сюжет:

введіть опис зображення тут

Я хотів би мати таку ж легенду, але використовувати дві змінні окремо

ggplot(data=x, aes(x=time, y=val, linetype=val_type, col=sex)) +
geom_line()

Це можливо? Причина, по якій я не хотів би використовувати комбіновану змінну, полягає в тому, що я не хочу створювати змінні, які не потрібні для аналізу. Інша причина полягає в тому, щоб побачити, як легенда може бути налаштована вручну. Дякуємо за допомогу.

Відповіді:

2 для відповіді № 1

Я не бачу створення нової змінної як основної проблеми (особливо якщо ви використовуєте труби). interaction функція і використовуючи ваші ручні визначення масштабу.

ggplot(data = x,
aes(x = time,
y = val,
linetype = interaction(val_type, sex),
col = interaction(val_type, sex))) +
geom_line() +
scale_colour_manual(name = ""
, values=c("red","red","blue","blue")
, labels=c("Female fitted","Female observed"
,"Male fitted","Male observed")
) +
scale_linetype_manual(name = ""
, values=c(1,2,1,2)
, labels=c("Female fitted","Female observed"
,"Male fitted","Male observed")
)

введіть опис зображення тут