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')