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

标签 r ggplot2 bioinformatics

有人知道如何创建像屏幕截图中的图形吗?我试图在调整 alpha 时获得类似的效果,但这会使异常值几乎不可见。我只从名为 FlowJo 的软件中了解这种类型的图形,在这里他们将其称为“伪彩色点图”。不确定这是否是官方术语。

Screenshot from Corces et al., Nature Genetics 2016

我想专门在 ggplot2 中执行此操作,因为我需要分面选项。我附上了我的一个图表的另一个屏幕截图。垂直线描绘了某些基因组区域的突变簇。其中一些集群比其他集群更密集。我想用密度颜色来说明这一点。

Rainfall Plot

数据相当大且难以模拟,但这里有一个尝试。我看起来不像实际数据,但数据格式是一样的。

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")

任何帮助都受到高度赞赏。

最佳答案

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")

enter image description here

在实践中,我会采用初始带宽猜测,然后找出最佳带宽。除了采用惰性方法并仅绘制不带过滤的点( 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)
}

enter image description here
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")

enter image description here

这个:
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())

enter image description here

让您非常接近默认值 smoothScatter()使用,但 hackishly 完成了大部分 nrpoints过滤代码在 smoothScatter()仅通过限制 y 轴限制来发挥作用。

关于r - 在ggplot2散点图中使用伪色来表示密度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39039073/

相关文章:

r - 使用 ggplot2 叠加双变量高斯分布的两个等高线

r - ggplot alpha = 0 不工作

r - 密度图矩阵,每个图覆盖两个分布

linux - 在linux中将tab转换为fasta格式

alignment - 使用 BWA 创建用于下游分析的输入 BAM 文件

r - 无法加载 R DESeq2 库,安装了所有缺失的软件包,但仍然存在问题

r - 使用 r "tables"包的嵌套表、列内子组总计、频率和百分比

r - 在 r 中添加带有堆积条形图的非线性线

r - 突出显示 ggplot 堆积条形图中的一个因素

theta模型的python实现(theta方法)