ggplot - 使用重新排序的数据保留轴标签着色

时间:2018-06-08 20:43:03

标签: r ggplot2

我正在制作一个水平条形图,其中每个观察都有一个与之关联的数字计数变量。我想显示按(递减)计数排序的每个变量的条形,这没有问题。但是,我还想根据第三个二分变量突出显示变量名称。我在这里的另一篇文章中找到了如何做后者,但我无法将两者结合起来。这是我的意思的一个例子:

library(ggplot2)

testdata<-data.frame("var"=c('V1','V2','V3','V4'),"cat"=c('Y','N','Y','N'),
"count"=c(1,5,2,10))

ggplot(testdata, aes(var,count))+
geom_bar(stat='identity',colour='blue',fill='blue',width=0.3)+ 
coord_flip(ylim=c(0,10))+
theme(axis.text.y=
element_text(colour=ifelse(testdata$cat=="N","darkgreen","darkred"),
size=15))

这是带有突出显示的水平条形图,工作正常 - V1 / V3为红色,V2 / V4为绿色。

但是,当我尝试排序时,它不会保留组:

ggplot(testdata, aes(reorder(var,count),count))+
geom_bar(stat='identity',colour='blue',fill='blue',width=0.3)+ 
coord_flip(ylim=c(0,10))+theme_classic()+
theme(axis.ticks.y=element_blank())+
theme(axis.text.y=
element_text(colour=ifelse(testdata$cat=="N","darkgreen","darkred"),
size=15))

在第二张图中,V2和V3颜色错误。

我还尝试先按计数对数据进行排序,然后使用第一个ggplot语句,但它仍然按变量名而不是计数来绘制数据(即使它确实有效,我也必须解决绑定的计数值) 。有任何想法吗?我真正需要的是“ifelse”颜色中的数据帧与aes语句中的数据帧匹配。我尝试使用在颜色语句中按降序计数排序的数据框,但这也不起作用。

由于

编辑:更多代码

testdata$var = with(testdata, reorder(var, count))

ggplot(testdata, aes(var,count))+
geom_bar(stat='identity',colour='blue',fill='blue',width=0.3)+ 
coord_flip(ylim=c(0,10))+theme_classic()+
theme(axis.ticks.y=element_blank())+
theme(axis.text.y=
element_text(colour=ifelse(testdata$cat=="N","darkgreen","darkred"),
size=15))

1 个答案:

答案 0 :(得分:2)

我的评论部分不正确。对于轴的顺序,级别的顺序是唯一重要的,但是当我们ifelse(testdata$cat == "N", "darkgreen", "darkred")时,它按照数据的顺序排列!所以我们需要级别的顺序和数据的顺序是相同的:

testdata$var = with(testdata, reorder(var, count))
testdata = testdata[order(testdata$var), ]

ggplot(testdata, aes(var, count)) +
    geom_bar(
        stat = 'identity',
        colour = 'blue',
        fill = 'blue',
        width = 0.3
    ) +
    coord_flip(ylim = c(0, 10)) + theme_classic() +
    theme(axis.ticks.y = element_blank()) +
    theme(axis.text.y =
                    element_text(
                        colour = ifelse(testdata$cat == "N", "darkgreen", "darkred"),
                        size = 15
                    ))

enter image description here