我正在尝试创建背靠背的条形图,而不是
Creating a stacked bar chart centered on zero using ggplot
然而,即使我已将fill变量指定为有序因子,我的条形中填充水平的顺序似乎也会被忽略?
MWE
# Illustrate problem with factors being ignored
mydata <- read.csv(textConnection(
"Attribute, Score, Percent
A1, Poor, 10
A1, Below Avg, 20
A1, Above Avg, 20
A1, Excellent, 50
A2, Poor, 20
A2, Below Avg, 20
A2, Above Avg, 20
A2, Excellent, 40"), as.is=TRUE, strip.white=TRUE, header=TRUE)
mydata$Score <- factor(mydata$Score,
levels=c('Poor','Below Avg','Above Avg','Excellent'), order=TRUE)
str(mydata)
myplot <- ggplot(data=mydata, aes(x=Attribute))+
geom_bar(data=subset(mydata,
as.character(mydata$Score) %in% c("Poor","Below Avg")),
aes(y= -Percent, fill=Score), stat='identity')+
geom_bar(data=subset(mydata,
!as.character(mydata$Score) %in% c("Poor","Below Avg")),
aes(y= Percent, fill=Score), stat='identity')+
geom_hline( yintercept=0, size=2, color="red")+
coord_flip()
myplot
给出
请注意,填充级别按字母顺序排序,而不是根据排序因子排序。
由于 卡尔施瓦茨
答案 0 :(得分:1)
这是一个具有挑战性的问题。我已经找到了解决办法,但事实是我不明白为什么理由可以解决这个问题。
mydata <- mydata[c(2,1,3,4,6,5,7,8), ]
起初我认为问题出在转换因素中,但是你输入的代码效果很好。
改变图例的顺序似乎是个好主意。
myplot + scale_fill_discrete(limits=c("Excellent", "Above Avg", "Below Avg","Poor"))