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

2024-03-25

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

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

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

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

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

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

This:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ggplot2散点图中使用伪彩色来表示密度 的相关文章

随机推荐