我想要完成的事情在概念上非常简单,但我找不到办法,除非我做两个不同的情节并将它们与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")
产生:
所有条目都在两个X轴上,对应于长度为10的条形在左边是空的,对应于长度为9的条形在右边是空的... 我可以只在左边有长度为9的条目,在右边只有长度为10的条目吗?感谢
产生的数字让我想到了关于条目顺序的另一个问题...为什么9在小平面中排在10之前,但是当在每个X轴上排列条目时,长度为10的条目在长度为9之前。 ??如果我想保留所有条目,我怎么能在任何地方得到正确的订单(10之前的9)??
请注意,解决方案应该是通用的,这个例子只有长度9和10,但我可以有长度8,9,10和11的任意组合......
答案 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)])])