Переупорядочение меток легенды для 3 geom_smooth на одном участке - PullRequest
0 голосов
/ 08 июня 2019

Последние пару часов я смотрю на решения, но не могу найти аналог, который щелкает.Я пытаюсь просто изменить название легенды для сюжета с 3 geom_smooth's.Мой фрейм данных имеет 3 столбца в виде отдельных строк, и все они построены по отношению к 4-му столбцу.Для упрощения я создал очень маленький фрейм данных:

x <- data.frame("Score" = c(2,4,7,3,2,1,5,6,4,3,1,3), "var1" = c(3,4,3,6,7,6,4,3,5,7,7,3), "var2" = c(3,5,6,5,2,3,7,8,4,3,6,1))
x

ggplot(data = x)+
  geom_smooth(mapping = aes(x = Score, y=var1 , linetype = "var1"), color = "black", se = FALSE)+
  geom_smooth(mapping = aes(x = Score, y=var2, linetype = "var2"), colour = "black", se = FALSE)+
  scale_x_discrete()+
  scale_y_discrete()

В этом примере я просто хочу переместить "y в возрасте 13-18 лет" ниже другой метки.Чтобы уточнить, обе линии на этом графике находятся в одном и том же масштабе (у).

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

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

Новый код, опубликованный ФП в комментарии 1013 *.

x <- data.frame("Score" = c(2,4,7,3,2,1,5,6,4,3,1,3), 
                "Age_6to10" = c(3,4,3,6,7,6,4,3,5,7,7,3), 
                "Age_13to18" = c(3,5,6,5,2,3,7,8,4,3,6,1))

x

ggplot(data = x) +
  geom_smooth(mapping = aes(x = Score, y= Age_6to10 , linetype = "y at Age 6-10"), color = "black", se = FALSE) +
  geom_smooth(mapping = aes(x = Score, y=Age_13to18, linetype = "y at Age 13-18"), colour = "black", se = FALSE)+ 
  scale_x_discrete() + 
  scale_y_discrete(name= "y") 

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Лучше переформатировать данные с широкого на длинный, затем построить их.
Метки расположены в требуемом порядке, так как после переформатирования variable - это коэффициент с уровнями в правильном порядке.См. Вывод str ниже.

xlong <- reshape2::melt(x, id.vars = "Score")
str(xlong)
#'data.frame':  24 obs. of  3 variables:
# $ Score   : num  2 4 7 3 2 1 5 6 4 3 ...
# $ variable: Factor w/ 2 levels "Age_6to10","Age_13to18": 1 1 1 1 1 1 1 1 1 1 ...
# $ value   : num  3 4 3 6 7 6 4 3 5 7 ...


ggplot(data = xlong,
       mapping = aes(x = Score, y = value, linetype = variable)) +
  geom_smooth(color = "black", se = FALSE) +
  scale_x_discrete() + 
  scale_y_discrete(name= "y") 

enter image description here

1 голос
/ 08 июня 2019

Рекомендуется использовать ggplot для изменения формы данных, чтобы каждая из характеристик, которые вы хотите отобразить в легенде, и которые вы хотите сопоставить с эстетикой (скажем, тип линии), будет помещена в столбец. В этом случае я использую tidyr::gather, чтобы перенести значения двух возрастных групп в один столбец, а спецификацию какой группы - в другой столбец.

ggplot(data = tidyr::gather(x, group, value, -Score)) +
  geom_smooth(mapping = aes(x = Score, y= value , 
                            linetype = forcats::fct_rev(group)),
                            color = "black", se = FALSE) +
  scale_x_discrete() + 
  scale_y_discrete(name= "y") +  
  scale_linetype_discrete(name = "Age group")

enter image description here Вот как выглядят измененные данные:

> tidyr::gather(x, group, value, -Score)
   Score      group value
1      2  Age_6to10     3
2      4  Age_6to10     4
3      7  Age_6to10     3
4      3  Age_6to10     6
5      2  Age_6to10     7
6      1  Age_6to10     6
7      5  Age_6to10     4
8      6  Age_6to10     3
9      4  Age_6to10     5
10     3  Age_6to10     7
11     1  Age_6to10     7
12     3  Age_6to10     3
13     2 Age_13to18     3
14     4 Age_13to18     5
15     7 Age_13to18     6
16     3 Age_13to18     5
17     2 Age_13to18     2
18     1 Age_13to18     3
19     5 Age_13to18     7
20     6 Age_13to18     8
21     4 Age_13to18     4
22     3 Age_13to18     3
23     1 Age_13to18     6
24     3 Age_13to18     1
...