我想要完成的事情在概念上非常简单,但我找不到一种方法来做到这一点,除非我做两个不同的图并将它们与 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 的条目之前??如果我想保留各处的所有条目,我怎样才能在各处获得正确的顺序(9 之前 10)?
请注意,该解决方案应该是通用的,这个示例只有长度 9 和 10,但我可以有长度 8、9、10 和 11 的任意组合...
最佳答案
将两个轴上的刻度更改为自由:
facet_grid(variable~len,scales="free")
(而不是“free_y”
)
对于第二个问题,条目被强制转换为因子向量,并且顺序恰好有长度为 10 的条目出现在长度 9 之前。您可以通过重新排序 oligo
中的级别来重新排序它们因素。
如果您想根据 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)])])
关于r - ggplot2 直方图构面 - 仅包含每个构面图的相关条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27538641/