在ggplot2中对条形图进行分组

时间:2012-09-16 19:06:51

标签: r ggplot2 dataframe

  

可能重复:
  Order Bars in ggplot2 bar graph

我有一个数据集,我希望有一个ggplot条形图描绘其中一个变量的比例,并根据另一个变量对条形图进行排序或排序。以下是数据集的示例。

grouping,category,domain
6,W,ced0.11
1,none,ced1.1
2,none,ced1.1
3,Z,ced1.5
2,Z,ced1.7
3,Z,ced1.3
3,none,ced1.6
2,none,ced1.1
1,Z,ced1.1
4,none,ced0.8
4,W,ced0.6
4,W,ced0.6
2,Z,ced1.5
2,W,ced1.6
4,Y,ced0.16
3,Z,ced1.5
4,Y,ced0.15
4,W,ced0.15
4,Y,ced0.24
6,W,ced0.8
4,Y,ced0.4
4,none,ced0.19
4,W,ced0.5
4,W,ced0.10
4,W,ced0.9
4,W,ced0.3
1,Z,ced1.6
4,W,ced0.9
4,W,ced0.15
1,Z,ced1.1
4,Y,ced0.19
6,W,ced0.4
4,W,ced0.16
4,W,ced0.6
4,W,ced0.5
2,Z,ced1.7
4,W,ced0.9
4,Y,ced0.1
4,W,ced0.2
4,Y,ced0.21
2,W,ced0.3
4,Y,ced0.21
4,W,ced0.10
1,Z,ced1.2
4,Y,ced0.16
1,Z,ced1.2
1,Z,ced1.2
5,W,ced0.23
4,Y,ced0.1

以及下面的代码,用于导入和显示条形图。

library(ggplot2)
ex1.dta <- read.csv("../../Datasets/ex1.txt",sep=",",header=TRUE)

#sort the data frame
ex1.dta2 <- transform(ex1.dta,domain=reorder(domain,category))

ggplot(ex1.dta2,aes(domain,fill=category)) +
  geom_bar(position="fill") + 
  scale_y_continuous(name="Proportion") + 
  scale_x_discrete(name="domains") +
  scale_fill_manual(values=c("#841108","#16a4e9","#a4a42a","#eb96ed","grey"),name="category") + 
  theme_bw() +
  opts(
    axis.text.x=theme_text(angle=-90,hjust=0),
    axis.line = theme_segment(colour = "black"),
    panel.grid.major = theme_blank(),
    panel.grid.minor = theme_blank(),
    panel.border = theme_blank()) +
  geom_vline(xintercept = 0)

enter image description here

当我使用转换来订购数据框时,我收到警告并且没有执行排序/排序。我真正想要的是排序,使每个类别的条形沿x轴组合在一起(并以递减的顺序)。 (所有棕色条纹在一起,浅蓝色在一起,以“分层方式”等等。)

我怎样才能实现这一目标?我需要多次订购吗?任何想法?

1 个答案:

答案 0 :(得分:1)

我不完全确定你真正想要的是什么,但你可能会尝试这样的事情:

ex1.dta2 <- transform(ex1.dta,domain=reorder(domain,category,FUN = function(x){ min(as.numeric(x)) }))

结果将取决于category的级别排列方式,因此如果这不是您想要的确切顺序,则应调整它。在这种情况下,我得到以下图表:

enter image description here

这里发生的是因子在内部存储为整数代码和标签集。因此,要根据因子category重新排序,我只需传递一个转换为整数代码的匿名函数,然后选择最小值。