以下是我的脚本(示例受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")
我想要的是在条件&#39;拒绝&#39;以及所有&#39;改进&#39;中订购我的条形图仅。不会插在中间。这是我想要的(在一些svg编辑之后):
所以现在整个&#39;衰落&#39;条件已分类,并且“改进”#39;条件来了。此外,理想情况下,即使条件没有表示值,条形也都将处于相同的宽度(例如&#34; Bla&#34;没有&#34;衰退&#34;值)。
有关如何在不使用SVG编辑器的情况下做到这一点的任何想法?非常感谢!
答案 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)
答案 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