Есть ли в R функция для объединения двух легенд графа, построенного из нескольких фреймов данных? - PullRequest
2 голосов
/ 19 февраля 2020

Я пытаюсь объединить легенды сюжета, но не могу понять, как. Я посмотрел много примеров, но в этих примерах люди строят графики из одного кадра данных. Мой сюжет построен из четырех информационных фреймов. Я попытался объединить эти датафреймы с функцией слияния и rbind, но я не могу понять, как это сделать правильно.

Возможно ли объединить легенды без слияния фреймов данных?

Это мой код

fig_ObjPlur_ASSenTD <- ggplot(subset(gazetarget_ObjPlur_ASS)) + 
      geom_line(data=gazetarget_ObjPlur_ASS,aes(x=Time, y=Targetgaze, color="Target", linetype="ASS"), size=1) + 
      geom_line(data=gazeother_ObjPlur_ASS,aes(x=Time, y=Othergaze, color="Distractor",linetype="ASS"), size=1) + 
      geom_line(data=gazetarget_ObjPlur_TD,aes(x=Time, y=Targetgaze, color="Target", linetype="TD"), size=1) +
      geom_line(data=gazeother_ObjPlur_TD,aes(x=Time, y=Othergaze, color="Distractor", linetype="TD"), size=1) +

    scale_color_manual(name = "Condition & Group", values=c("blue","red")) +
    scale_linetype_manual(name = "Condition & Group", values=c(1,2)) +
    theme(legend.key.width=unit(2.5,"line"))

fig_ObjPlur_ASSenTD + ggtitle("Looks to target vs. distractor picture") +
      xlab("Time in milliseconds from sentence start") + 
      ylab("Proportion of looks") +  
      xlim(0,3000)

, который дает мне этот график. Вместо двух легенд я хочу одну легенду с 4 точками:
- целевой ASD (синяя solid линия)
- отвлекающий ASD (красная solid линия)
- целевой TD (синяя пунктирная линия)
- TD Distractor (красная пунктирная линия)

Изображение графика

Мои кадры данных выглядят так:

Пример кадра данных ObjPlur_ASS

Помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 19 февраля 2020

У вас есть данные в широком формате, с ними проще иметь легенды в длинном формате, поэтому предположим, что ваши данные выглядят так:

gazetarget_ObjPlur_ASS = data.frame(
  Time = seq(0,3000,length.out=10),
  Targetgaze = runif(10),
  Othergaze = runif(10)
)

gazetarget_ObjPlur_TD = data.frame(
  Time = seq(0,3000,length.out=10),
  Targetgaze = runif(10),
  Othergaze = runif(10)
)

Сначала добавим еще один столбец, аннотирующий набор данных:

gazetarget_ObjPlur_ASS$Type = "ASD"
gazetarget_ObjPlur_TD$Type = "TD"

Затем мы устанавливаем цвет / тип линии для легенды:

COLS = c("blue","red","blue","red")
LINES = c("solid","solid","dashed","dashed")
names(COLS) = c("Target ASD","Distractor ASD","Target TD","Distractor TD")
names(LINES) = c("Target ASD","Distractor ASD","Target TD","Distractor TD")

Теперь мы переводим фрейм данных в длинный формат и также меняем значения на Target / Distractor:

DF = rbind(gazetarget_ObjPlur_ASS,gazetarget_ObjPlur_TD) %>%
pivot_longer(-c(Time,Type)) %>% 
mutate(name=recode_factor(name,Targetgaze="Target",Othergaze="Distractor")) %>%
mutate(Group=paste(name,Type)) 

Тогда сюжет:

ggplot(DF,aes(x=Time,y=value,col=Group,linetype=Group)) + 
geom_line() +
scale_color_manual(values=COLS,breaks=names(COLS)) +
scale_linetype_manual(values=LINES,breaks=names(COLS))

enter image description here

...