ggplot2直方图方面 - 仅包括每个方面图的相关条目

时间:2014-12-18 03:10:14

标签: r ggplot2 histogram facet

我想要完成的事情在概念上非常简单,但我找不到办法,除非我做两个不同的情节并将它们与grid.arrange放在一起,这不是我首选的解决方案。 我有来自长度9和长度10的条目的数据在图中被刻面,但我只想要左边的长度为9的条目和右边的长度为10的条目,而不是所有到处都有空的直方图条。

MWE

library(reshape2)
library(ggplot2)
my.df <- data.frame(oligo=rep(c("NSSCMGSMNR","SSCMGSMNR","SSCMGSMNRR","VVGAGDVGK",
                                "VVGAVGVGK","VVVGAGDVGK","VVVGAVGVGK"), each=4), 
                    a11.a24=rep(c("-/-","+/-","-/+","+/+"), 7), 
                    a11=rep(c("-","+","-","+"), 7), a24=rep(c("-","-","+","+"), 7),
                    freq1=c(0,3,0,1,0,3,0,1,0,3,0,1,2,3,2,0,4,2,1,4,2,3,2,0,4,2,1,4), 
                    freq2=c(0,4,0,4,0,4,0,4,0,4,0,4,4,3,4,3,5,6,5,6,4,3,4,3,5,6,5,6), 
                    freq3=c(3,3,1,1,3,3,1,1,3,3,1,1,5,5,2,2,6,6,5,5,5,5,2,2,6,6,5,5), 
                    len=rep(c(10,9,10,9,9,10,10), each=4))
my.df <- with(my.df, my.df[order(my.df$len, my.df$freq1, decreasing=T),])
my.df.m <- melt(my.df, measure.vars=c('a11.a24', 'a11', 'a24'))
my.df.m$oligo <- factor(my.df.m$oligo, levels=unique(my.df.m$oligo))
ggplot(my.df.m, aes(x=oligo)) +
  facet_grid(variable~len, scales="free_y") +
  geom_histogram(data=subset(my.df.m, variable=='a11.a24'),
    aes(y=freq1, fill=value), stat="identity", position=position_dodge()) +
  geom_histogram(data=subset(my.df.m, variable=='a11'),
    aes(y=freq2, fill=value), stat="identity", position=position_dodge()) +
  geom_histogram(data=subset(my.df.m, variable=='a24'),
    aes(y=freq3, fill=value), stat="identity", position=position_dodge()) +
  ggtitle("Number of patients with a given oligo") +
  theme(axis.text.x=element_text(angle=45, hjust=1, size=7), 
        legend.title=element_blank(), legend.position="right", 
        legend.background=element_blank(), legend.box.just="left",
        plot.title=element_text(size=15, face="bold", colour="black", vjust=1.5)) +
  scale_y_continuous(name = "num. patients") +
  scale_x_discrete(name = "oligo")

产生: enter image description here

所有条目都在两个X轴上,对应于长度为10的条形在左边是空的,对应于长度为9的条形在右边是空的... 我可以只在左边有长度为9的条目,在右边只有长度为10的条目吗?感谢

产生的数字让我想到了关于条目顺序的另一个问题...为什么9在小平面中排在10之前,但是当在每个X轴上排列条目时,长度为10的条目在长度为9之前。 ??如果我想保留所有条目,我怎么能在任何地方得到正确的订单(10之前的9)??

请注意,解决方案应该是通用的,这个例子只有长度9和10,但我可以有长度8,9,10和11的任意组合......

1 个答案:

答案 0 :(得分:4)

在两个轴上更改刻度:

facet_grid(variable~len, scales="free")(而不是"free_y"

对于第二个问题,条目被强制转换为因子向量,并且顺序恰好在长度为9之前具有长度为10的条目。您可以通过重新排序oligo因子中的级别来重新排序它们。 / p>

如果您想根据len列进行操作:

my.df.m$oligo = factor(my.df.m$oligo, 
                       levels(my.df.m$oligo)[unique(my.df.m$oligo[order(my.df.m$len)])])