点数过多的散点图

我试图绘制两个变量,其中 N = 700K。问题是,有太多的重叠,使情节成为大多数坚实的块黑色。有没有一种方法可以得到一个灰度“云”,其中阴谋的黑暗程度是一个区域中点数的函数?换句话说,我不想显示单独的点,我希望图像是一个“云”,一个区域中的点越多,该区域就越暗。

106352 次浏览

处理这个问题的一种方法是使用 alpha 混合,它使每个点略微透明。所以区域看起来比较暗,在它们上面有更多的点。

这在 ggplot2中很容易做到:

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)

enter image description here

处理这个问题的另一个方便的方法是(可能更适合你的点数)六边形装箱:

ggplot(df,aes(x=x,y=y)) + stat_binhex()

enter image description here

另外还有常规的长方形装箱(图片省略) ,这更像你的传统热图:

ggplot(df,aes(x=x,y=y)) + geom_bin2d()

你也可以使用密度等高线(ggplot2) :

df <- data.frame(x = rnorm(15000),y=rnorm(15000))
ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()

enter image description here

或者将密度等值线与 alpha 混合结合起来:

ggplot(df,aes(x=x,y=y)) +
geom_point(colour="blue", alpha=0.2) +
geom_density2d(colour="black")

enter image description here

你可能会发现有用的 hexbin软件包。从 hexbinplot的帮助页:

library(hexbin)
mixdata <- data.frame(x = c(rnorm(5000),rnorm(5000,4,1.5)),
y = c(rnorm(5000),rnorm(5000,2,3)),
a = gl(2, 5000))
hexbinplot(y ~ x | a, mixdata)

hexbinplot

阿尔法混合是很容易做的基础图形以及。

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
with(df, plot(x, y, col="#00000033"))

#后面的前六个数字是 RGB 十六进制颜色,最后两个数字是不透明度,也是十六进制颜色,所以33 ~ 3/16不透明度。

enter image description here

您还可以查看 ggsubplot包。这个软件包实现了 Hadley Wickham 在2011年提出的特性(http://blog.revolutionanalytics.com/2011/10/ggplot2-for-big-data.html)。

(在下面,我包括“点”-图层为了说明的目的。)

library(ggplot2)
library(ggsubplot)


# Make up some data
set.seed(955)
dat <- data.frame(cond = rep(c("A", "B"), each=5000),
xvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)),
yvar = c(rep(1:20,250) + rnorm(5000,sd=5),rep(16:35,250) + rnorm(5000,sd=5)))




# Scatterplot with subplots (simple)
ggplot(dat, aes(x=xvar, y=yvar)) +
geom_point(shape=1) +
geom_subplot2d(aes(xvar, yvar,
subplot = geom_bar(aes(rep("dummy", length(xvar)), ..count..))), bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)

enter image description here

然而,如果您有第三个变量要控制,那么这个特性就是岩石。

# Scatterplot with subplots (including a third variable)


ggplot(dat, aes(x=xvar, y=yvar)) +
geom_point(shape=1, aes(color = factor(cond))) +
geom_subplot2d(aes(xvar, yvar,
subplot = geom_bar(aes(cond, ..count.., fill = cond))),
bins = c(15,15), ref = NULL, width = rel(0.8), ply.aes = FALSE)

enter image description here

或者另一种方法是使用 smoothScatter():

smoothScatter(dat[2:3])

enter image description here

ggplot2中几个好的选择概述:

library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)

备选方案 A: 透明点

o1 <- ggplot(df, aes(x, y)) +
geom_point(alpha = 0.05)

方案 B: 添加密度等高线

o2 <- ggplot(df, aes(x, y)) +
geom_point(alpha = 0.05) +
geom_density_2d()

选项 C: 添加填充密度等高线

(请注意,点扭曲了下面的颜色感知,可能是更好的没有点。)

o3 <- ggplot(df, aes(x, y)) +
stat_density_2d(aes(fill = stat(level)), geom = 'polygon') +
scale_fill_viridis_c(name = "density") +
geom_point(shape = '.')

方案 D: 密度热图

(与 C 同音)

o4 <- ggplot(df, aes(x, y)) +
stat_density_2d(aes(fill = stat(density)), geom = 'raster', contour = FALSE) +
scale_fill_viridis_c() +
coord_cartesian(expand = FALSE) +
geom_point(shape = '.', col = 'white')

选项 E: 己形盒子

(与 C 同音)

o5 <- ggplot(df, aes(x, y)) +
geom_hex() +
scale_fill_viridis_c() +
geom_point(shape = '.', col = 'white')

选项 F: 地毯

可能是我最喜欢的选择。不是很华丽,但视觉上简单易懂。在很多情况下非常有效。

o6 <- ggplot(df, aes(x, y)) +
geom_point(alpha = 0.1) +
geom_rug(alpha = 0.01)

合并成一个数字:

cowplot::plot_grid(
o1, o2, o3, o4, o5, o6,
ncol = 2, labels = 'AUTO', align = 'v', axis = 'lr'
)

enter image description here

我最喜欢的绘制此类数据的方法是 这个问题-a 散点密度图散点密度图中描述的方法。这个想法是做一个散点图,但颜色的点的密度(粗略地说,重叠的数量在该领域)。

同时:

  • 清楚显示异常值的位置,以及
  • 显示了密集区域的任何结构。

下面是这个相关问题的最佳答案:

scatter-density plot

来自 ggpointdensity包裹geom_pointdenisty(最近由 Lukas Kremer 和 Simon Anders (2019)开发)可以让你同时可视化密度和单个数据点:

library(ggplot2)
# install.packages("ggpointdensity")
library(ggpointdensity)


df <- data.frame(x = rnorm(5000), y = rnorm(5000))
ggplot(df, aes(x=x, y=y)) + geom_pointdensity() + scale_color_viridis_c()