分组条形图:订购x轴&如果缺少水平,保持恒定的条宽

时间:2016-08-11 12:32:45

标签: r svg ggplot2 bar-chart

以下是我的脚本(示例受here启发并使用here中的reorder选项):

library(ggplot2)
Animals <- read.table(
  header=TRUE, text='Category        Reason Species
1   Decline       Genuine      24
2  Improved       Genuine      16
3  Improved Misclassified      85
4   Decline Misclassified      41
5   Decline     Taxonomic       2
6  Improved     Taxonomic       7
7   Decline       Unclear      10
8  Improved       Unclear     25
9  Improved           Bla     10
10  Decline         Hello     30')

fig <- ggplot(Animals, aes(x=reorder(Animals$Reason, -Animals$Species), y=Species, fill = Category)) + 
  geom_bar(stat="identity", position = "dodge")

这给出了以下输出图:enter image description here

我想要的是在条件&#39;拒绝&#39;以及所有&#39;改进&#39;中订购我的条形图。不会插在中间。这是我想要的(在一些svg编辑之后):

enter image description here

所以现在整个&#39;衰落&#39;条件已分类,并且“改进”#39;条件来了。此外,理想情况下,即使条件没有表示值,条形也都将处于相同的宽度(例如&#34; Bla&#34;没有&#34;衰退&#34;值)。

有关如何在不使用SVG编辑器的情况下做到这一点的任何想法?非常感谢!

4 个答案:

答案 0 :(得分:4)

首先让我们用你想要的组合填充你的data.frame。

library(dplyr)
Animals2 <- expand.grid(Category=unique(Animals$Category), Reason=unique(Animals$Reason)) %>% data.frame %>% left_join(Animals)

然后你可以为x-scale创建一个排序变量:

myorder <- Animals2 %>% filter(Category=="Decline") %>% arrange(desc(Species)) %>% .$Reason %>% as.character

然后情节:

ggplot(Animals2, aes(x=Reason, y=Species, fill = Category)) + 
  geom_bar(stat="identity", position = "dodge") + scale_x_discrete(limits=myorder)

enter image description here

答案 1 :(得分:2)

使用“类别”和“原因”的所有组合定义新数据框,与数据框“动物”中的“物种”数据合并。通过正确的scale_x_discrete修改ggplot:

Animals3 <-  expand.grid(Category=unique(Animals$Category),Reason=unique(Animals$Reason))
Animals3 <- merge(Animals3,Animals,by=c("Category","Reason"),all.x=TRUE)
Animals3[is.na(Animals3)] <- 0
Animals3 <- Animals3[order(Animals3$Category,-Animals3$Species),]
ggplot(Animals3, aes(x=Animals3$Reason, y=Species, fill = Category)) + geom_bar(stat="identity", position = "dodge") + scale_x_discrete(limits=as.character(Animals3[Animals3$Category=="Decline","Reason"]))

答案 2 :(得分:1)

要实现类似的功能,我在使用ggplot时会调整数据框。添加值为零的缺失类别。

Animals <- rbind(Animals, 
                 data.frame(Category = c("Improved", "Decline"), 
                            Reason = c("Hello", "Bla"), 
                            Species = c(0,0)
                            )
)

答案 3 :(得分:1)

与用户Alex的回答相同,添加类别的手动方式可能是

d <- with(Animals, expand.grid(unique(Category), unique(Reason)))
names(d) <- names(Animals)[1:2]
Animals <- merge(d, Animals, all.x=TRUE)
Animals$Species[is.na(Animals$Species)] <- 0