2013-08-27 64 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其中有人可能會覺得得心應手。