在ggplot2散点图中使用伪彩色来表示密度

Pee*_*che 4 r bioinformatics ggplot2

有人知道如何创建截图中的图形吗?我试图获得类似的效果调整alpha,但这会使异常值几乎不可见.我只从一个名为FlowJo的软件中知道这种类型的图形,这里它们称之为"伪彩色点图".不确定这是否是一个官方用语.

截图来自Corces等人,Nature Genetics 2016

我想在ggplot2中专门做,因为我需要faceting选项.我附上了我的一张图表的另一张截图.垂直线描绘了某些基因组区域的突变簇.其中一些集群比其他集群密集得多.我想用密度颜色来说明这一点.

降雨情节

数据非常庞大且难以模拟,但这是一次尝试.我看起来不像实际数据,但数据格式是一样的.

chr <- c(rep(1:10,1000))
position <- runif(10000, min=0, max=5e8)
distance <- runif(10000, min=1, max=1e5)
log10dist <- log10(distance)

df1 <- data.frame(chr, position, distance, log10dist)

ggplot(df1, aes(position, log10dist)) + 
  geom_point(shape=16, size=0.25, alpha=0.5, show.legend = FALSE) +
  facet_wrap(~chr, ncol = 5, nrow = 2, scales = "free_x")
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感谢.

hrb*_*str 6

library(ggplot2)
library(ggalt)
library(viridis)

chr <- c(rep(1:10,1000))
position <- runif(10000, min=0, max=5e8)
distance <- runif(10000, min=1, max=1e5)
log10dist <- log10(distance)

df1 <- data.frame(chr, position, distance, log10dist)

ggplot(df1, aes(position, log10dist)) + 
  geom_point(shape=16, size=0.25, show.legend = FALSE) +
  stat_bkde2d(aes(fill=..level..), geom="polygon") +
  scale_fill_viridis() +
  facet_wrap(~chr, ncol = 5, nrow = 2, scales = "free_x")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

实际上,我会先考虑初始带宽,然后计算出最佳带宽.除了采用惰性方法并且只绘制没有过滤的点(smoothScatter()过滤除了基于异常值的所有内容npoints)之外,这就像生成的例子一样生成"平滑的散点图".

smoothScatter() 使用不同的默认值,所以它有点不同:

par(mfrow=c(nr=2, nc=5))
for (chr in unique(df1$chr)) {
  plt_df <- dplyr::filter(df1, chr==chr)
  smoothScatter(df1$position, df1$log10dist, colramp=viridis)
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

geom_hex() 将显示异常值,但不是明确的点:

ggplot(df1, aes(position, log10dist)) + 
  geom_point(shape=16, size=0.25, show.legend = FALSE, color="red") +
  scale_fill_viridis() +
  facet_wrap(~chr, ncol = 5, nrow = 2, scales = "free_x")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这个:

ggplot(df1, aes(position, log10dist)) + 
  geom_point(shape=16, size=0.25) +
  stat_bkde2d(bandwidth=c(18036446, 0.05014539), 
              grid_size=c(128, 128), geom="polygon", aes(fill=..level..)) +
  scale_y_continuous(limits=c(3.5, 5.1)) +
  scale_fill_viridis() +
  facet_wrap(~chr, ncol = 5, nrow = 2, scales = "free_x") +
  theme_bw() +
  theme(panel.grid=element_blank())
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

让你非常接近默认值smoothScatter()使用,但是通过限制y轴限制,可以实现nrpoints过滤代码在smoothScatter()函数中的大部分功能.