Как изменить порядок наложения геомов, но сохранить порядок легенд в ggplot - PullRequest
0 голосов
/ 19 мая 2018

Я знаю, что могу изменить порядок построения линий (то есть, какую линию построить 1-й, 2-й, 3-й, ...), изменив levels коэффициента группировки.Однако при этом также переключает порядок легенды ggplot.

Как изменить порядок построения, но сохранить исходный порядок легенды?


Пример

С учетом следующего data.frame:

dat <- data.frame(id = rep(factor(letters[1:3]),3), y = c(1:3,3,2,1,1,3,1), x = rep(1:3,each = 3))

Я могу изменить порядок построения линий, изменив levels id фактор:

  • например, путем переупорядочения уровней с использованием dat$id = relevel(dat$id, 'c').

Используя следующий код ggplot для исходных и relevel 'данных:

library(ggplot2)

#Create coloring objects to kep color consistent:
  cols <- rep(1:3,3)
    names(cols) <- letters[1:3]

#Create line graph:
  ggplot(dat,aes(x=x,y=y,color=id)) + geom_line(size = 2) + 
    scale_colour_manual('id',values=cols)  ##set custom static coloring

создает следующие 2 графика:

enter image description here

Слева: исходный порядок уровней для фактора id |Справа: использование relevel

Обратите внимание, что строки были успешно переупорядочены: строка c переходит от последней печати (и, следовательно, сверху) к печати первой (и, следовательно, снизу).

Однако , легенда также изменила порядок!

Как сохранить порядок легенды на левом графике, но изменить порядок печати строк, чтобы соответствоватьчто за правильный график?

1 Ответ

0 голосов
/ 07 сентября 2018

Возможно, вы уже нашли решение.Только что увидел, что этот вопрос до сих пор «без ответа», и вот предложение, основанное на комментарии @ Hendrik - которое было очень полезным, но не полное решение (его код дает ваш сюжет 2)

dat$id2 = relevel(dat$id, 'c') # just create a dummy column with the releveled factors

ggplot(dat) + 
  geom_line(aes(x = x, y = y, color = id2), size = 2) + 
# use your dummy column for the line order
  scale_colour_manual('id',values = cols, breaks = levels(dat$id))  
# use @Hendriks break suggestion

enter image description here

...