【问题标题】:Color code points based on percentile in ggplotggplot中基于​​百分位的颜色代码点
【发布时间】:2013-08-30 16:04:16
【问题描述】:

我有一些非常大的文件,其中包含基因组位置(位置)和相应的群体遗传统计数据(值)。我已经成功绘制了这些值,并希望对前 5%(蓝色)和 1%(红色)的值进行颜色编码。我想知道在 R 中是否有一种简单的方法可以做到这一点。

我已经探索过编写一个定义分位数的函数,但是,其中许多最终都不是唯一的,因此会导致函数失败。我也研究了 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

【问题讨论】:

  • 您会发现,如果您提供可使用的数据,您会获得更快、更好的响应。显示您如何获得fst 并没有帮助,因为我们没有您的任何起始数据。您可以使用dput() 发布您自己的一些数据,或者制作一个最小的虚拟集。
  • 接受您问题的答案是不行的,然后决定在一个月后更改问题,不接受答案并修改您的问题 - 这完全违背了存档问答格式的目的。如果您有新问题,请发布新问题!最好的办法是撤消您的编辑,重新接受答案,然后发布您的新问题。
  • 对不起亚历克斯万!我是这种问答格式的新手,我认为如果它有一个可接受的答案,就不会看到编辑。我没想过把它作为一个新问题发布。
  • 新问题现在在这里:stackoverflow.com/questions/19330546/…

标签: r ggplot2 facet percentile color-codes


【解决方案1】:

通过将quantilecut 合并到aes 颜色表达式中,您可以更优雅地实现这一点。例如本例中的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))

我还为pretty legend labels 制作了一个有用的工作流程,有人可能会觉得很方便。

【讨论】:

    【解决方案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。我认为使用 cut 可能会更有效:transform(dat, quant=cut(value, quantile(value, c(0,.95,.99,1)), c("0-95", "95-99", "99-100"), TRUE))
    • 感谢 alexwhan!这运作良好。现在,我想为颜色编码增加一个新的复杂程度(参见上面的编辑帖子),并且似乎无法获得正确的值。有任何想法吗?谢谢!
    【解决方案3】:

    我不确定这是否是您正在搜索的内容,但也许它会有所帮助:

    # 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())  
    

    结果我得到了

    【讨论】:

      猜你喜欢
      • 2013-10-20
      • 2023-04-07
      • 2014-11-26
      • 2011-05-23
      • 2018-03-20
      • 2012-04-07
      • 2021-08-31
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多