按高度从左到右排序分组geom_bar

时间:2018-05-18 21:32:44

标签: r ggplot2 geom-bar

以下R脚本:

library(ggplot2)

data <- read.csv(text="x,value,version
foo,10,one
foo,12,two
bar,8,one
bar,7,two
baz,11,one
baz,14,two", header=TRUE)

png(filename="so.png")
ggplot(data,aes(data$x,data$value,fill=data$version)) + 
  geom_bar(stat="identity",position="dodge") + 
  scale_fill_brewer(palette="Set1") + 
  labs(x = "x",y="value") + 
  guides(fill=guide_legend(title="version"))
dev.off()

生成以下图表:

enter image description here

它们按字母顺序根据“x”列(foo,bar,baz)从左到右显示。但是,我希望根据其中一个版本显示“x”列分组条,最左边是最高“值”列值。例如。根据“一”版本的值从左到右。因此:

  • 最左边:baz(一:11,二:14)
  • middle:foo(one:10,two:12)
  • 最右边:bar(one:8,two:7)

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

我引用的问题的一般原则总是成立:您通过设置因子级别顺序来控制顺序。很多人都被绊倒了,因为那个问题的答案并不总能准确地告诉你如何在每一种情况下重新排序你的因素。但这个想法总是一样的。以下是以各种方式设置因子水平的方法:

#Cleverly
library(forcats)
data$x <- fct_reorder2(.f = data$x,
                       x = data$value,
                       y = data$version,
                       fun = function(x,y) x[y == "one"])

#Manually
data$x <- factor(data$x,levels = c("baz","foo","bar"))

#Tortuously
levels(data$x) <- data$x[data$version == "one"][order(data$value[data$version == "one"],decreasing = TRUE)]

#tidily
library(dplyr)
levels(data$x) <- data %>%
  filter(version == "one") %>%
  arrange(desc(value)) %>%
  pull(x)