2013-08-27 45 views
0

我有一些非常大的文件,其中包含基因组位置(位置)和相应的群体遗传统计(值)。我已成功绘制了这些值,并且希望为顶部5%(蓝色)和1%(红色)的值进行颜色编码。我想知道如果有一个简单的方法R.做到这一点基于ggplot百分位数的颜色代码点

Fst Values

我已经探讨写作然而定义位数,函数,其中许多人最终被不唯一,从而导致功能失败。我也研究过stat_quantile,但只使用它来绘制标记95%和99%的一条线(并且一些线对角线对我没有任何意义),但只有成功。(对不起,我是新来的R.)

任何帮助将不胜感激。

这里是我的代码:(该文件非常大)

########Combine data from multiple files 
fst <- rbind(data.frame(key="a1-a3", position=a1.3$V2, value=a1.3$V3), data.frame(key="a1-a2", position=a1.2$V2, value=a1.2$V3), data.frame(key="a2-a3", position=a2.3$V2, value=a2.3$V3), data.frame(key="b1-b2", position=b1.2$V2, value=b1.2$V3), data.frame(key="c1-c2", position=c1.2$V2, value=c1.2$V3)) 


########the plot 
theme_set(theme_bw(base_size = 16)) 

p1 <- ggplot(fst, aes(x=position, y=value)) + 
    geom_point() + 
    facet_wrap(~key) + 
    ylab("Fst") + 
    xlab("Genomic Position (Mb)") + 
    scale_x_continuous(breaks=c(1e+06, 2e+06, 3e+06, 4e+06), labels=c("1", "2", "3", "4")) + 
    scale_y_continuous(limits=c(0,1)) + 
    theme(plot.background = element_blank(), 
    panel.background = element_blank(), 
    panel.border = element_blank(), 
    legend.position="none", 
    legend.title = element_blank() 
    ) 
p1 
+0

如果您提供数据,您会发现更快,更好的响应。显示你如何得到'fst'没有帮助,因为我们没有任何你的起始数据。你可以用'dput()'发布你自己的一些数据,或者创建一个最小的虚拟集。 – alexwhan

+0

接受问题答案并不好,然后决定在一个月后更改问题,不接受答案并修改您的问题 - 这完全违背了存档问答格式的目的。如果您有新问题,请发布新问题!最好的办法是扭转你的编辑,重新接受答案,并发布你的新问题。 – alexwhan

+0

对不起alexwhan!我对这个问答格式不熟悉,并且认为如果它具有可接受的答案,就不会看到编辑。我没想过把它作为一个新问题发布。 – ONeillMB1

回答

2

这就是我如何接近它 - 基本上创建一个因素来定义每个观察所在的组,然后将colour映射到该因子。

首先,一些数据可以使用!

dat <- data.frame(key = c("a1-a3", "a1-a2"), position = 1:100, value = rlnorm(200, 0, 1)) 
#Get quantiles 
quants <- quantile(dat$value, c(0.95, 0.99)) 

有很多得到一个因素来确定哪个组的每个观测落入,这里的方式是:

dat$quant <- with(dat, factor(ifelse(value < quants[1], 0, 
            ifelse(value < quants[2], 1, 2)))) 

所以quant现在显示的观测值是在95-99或99+组。绘图中点的颜色可以很容易地映射到quant

ggplot(dat, aes(position, value)) + geom_point(aes(colour = quant)) + facet_wrap(~key) + 
    scale_colour_manual(values = c("black", "blue", "red"), 
         labels = c("0-95", "95-99", "99-100")) + theme_bw() 

+1

+1。我认为使用cut可以更有效一些:'transform(dat,quant = cut(value,quantile(value,c(0,.95,.99,1)),c(“0-95” 95-99“,”99-100“),TRUE))' –

+0

谢谢alexwhan!这很好。现在,我想为颜色编码添加一个新的复杂程度(请参阅上面编辑的帖子),并且似乎无法获得正确的值。有任何想法吗?谢谢! – ONeillMB1

0

我不确定如果这是你要搜索的内容,但也许它可以帮助:

# a little function which returns factors with three levels, normal, 95% and 99% 
qfun <- function(x, qant_1=0.95, qant_2=0.99){ 
    q <- sort(c(quantile(x, qant_1), quantile(x, qant_2))) 
    factor(cut(x, breaks = c(min(x), q[1], q[2], max(x)))) 
} 


df <- data.frame(samp=rnorm(1000)) 

ggplot(df, aes(x=1:1000, y=df$samp)) + geom_point(colour=qfun(df$samp))+ 
    xlab("")+ylab("")+ 
    theme(plot.background = element_blank(), 
     panel.background = element_blank(), 
     panel.border = element_blank(), 
     legend.position="none", 
     legend.title = element_blank()) 

为我得到了一个结果enter image description here

3

你可以做到这一点稍微通过将quantilecutaes色彩表现优雅。例如col=cut(d,quantile(d))在这个例子:

d = as.vector(round(abs(10 * sapply(1:4, function(n)rnorm(20, mean=n, sd=.6))))) 

ggplot(data=NULL, aes(x=1:length(d), y=d, col=cut(d,quantile(d)))) + 
    geom_point(size=5) + scale_colour_manual(values=rainbow(5)) 

enter image description here

我也做了有益的工作流程pretty legend labels其中有人可能会觉得得心应手。