如何按ggplot2 / R中某个填充类别的值排序堆积条形图x类别

时间:2017-01-02 08:46:08

标签: r ggplot2

我正在尝试将我的数据绘制为具有3个级别(“catg”)的堆积条,但我希望X轴上的类别按其“低”子类别的值按升序排列,

这是繁殖的例子:

#creating df:
set.seed(33)
df<-data.frame(value=runif(12),
               catg=factor(rep(c("high","medium","low")),
                           levels = c("high","medium","low")),
               var_name=(c(rep("question1",3),rep("question2",3),rep("question3",3),rep("question4",3)))
#plotting
bar_dist<-ggplot(df,aes(x=var_name,
                              y=value, 
                              fill=catg, 
                             label=round(value,2)))

bar_dist+ geom_bar(stat = "identity",
                   position = "dodge", 
                   width = 0.7)+
  coord_flip() +
  xlab("questions")+
  ylab("y")+
  geom_text(size = 4,position=position_dodge(width = 0.7))

这是我目前的情节:

enter image description here

所以在这种情况下我应该有问题3然后是4,1,最后是2。 每一个帮助都会得到欣赏,

2 个答案:

答案 0 :(得分:2)

一种方法可能是:

df$var_name=factor(df$var_name,levels=rev(levels(reorder(df[df$catg=="low",]$var_name,df[df$catg=="low",]$value))))

根据理查德·特尔福德的建议使用reorder(),在过滤df$value后仅根据df重新排序级别,仅保留"low"levels()用于从上一个函数中提取级别 rev()用于反转级别 factor()将级别重新分配到df$var_name

或:

df$var_name=factor(df$var_name,levels = df[with(df,order(value,decreasing = T)) ,][df[with(df,order(value,decreasing = T)) ,]$catg=="low",]$var_name)

它对df df$value进行排序(降低值),df$catg"low"进行过滤,并检索df$var_namefactor()用作CanBuildFrom中的级别1}}。

然后使用相同的绘图功能:

enter image description here

答案 1 :(得分:1)

使用fct_reorder2()库中的forcats修改数据框的解决方案:

library(forcats)

bar_dist <- ggplot(df,
                   aes(
                     x = fct_reorder2(var_name, catg, value),
                     y = value, fill = catg, 
                     label = round(value, 2)))

bar_dist + geom_bar(stat = "identity",
                   position = "dodge", 
                   width = 0.7) +
  coord_flip() +
  xlab("questions") +
  ylab("y") +
  geom_text(size = 4, position = position_dodge(width = 0.7))

Grouped barplot with columns ordered by value of one variable across groups