Ggplot2: флип-заказ легенды без изменения порядка в сюжете

Я обнаружил, что при добавлении ord_flip() к определенным графикам, используя ggplot2, порядок значений в легенде больше не выравнивается с порядком значений на графике.

Например:

dTbl = data.frame(x=c(1,2,3,4,5,6,7,8),
                  y=c('a','a','b','b','a','a','b','b'),
                  z=c('q','q','q','q','r','r','r','r'))

print(ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical'))

enter image description here

Я хотел бы, чтобы "q" и "r" в легенде были отменены без изменения порядка "q" и "r" на графике.

scale.x.reverse() выглядел многообещающим, но, похоже, он не работает в пределах факторов (как это имеет место для этого штрихового графика).

Ответ 1

Вы ищете guides:

ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical') + 
      guides(fill = guide_legend(reverse = TRUE))

В чате Брайана мне напомнили, что для произвольных упорядочений существует более общий способ, установив аргумент breaks:

ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
      geom_bar(position=position_dodge(), stat='identity') +
      coord_flip() +
      theme(legend.position='top', legend.direction='vertical') + 
      scale_fill_discrete(breaks = c("r","q"))

Ответ 2

Для произвольного переупорядочения уровня вы можете изменить порядок levels в factor:

dTbl$z=factor(dTbl$z,levels=c('r','q'))
ggplot(dTbl, aes(x=factor(y),y=x, fill=z)) +
       geom_bar(position=position_dodge(), stat='identity') +
       coord_flip() +
       theme(legend.position='top', legend.direction='vertical')

Ответ 3

Если вам не нравится элегантный ответ joran, вы можете пойти с взломом:

geom_bar(position=position_dodge(-.9), stat='identity')