140

我正在尝试绘制 N=700K 的两个变量。问题是重叠太多,以至于情节主要变成了黑色的实心块。有没有办法得到一个灰度“云”,其中情节的黑暗是一个区域中点数的函数?换句话说,我不希望显示单个点,而是希望绘图成为“云”,区域中的点数越多,该区域越暗。

4

8 回答 8

154

解决这个问题的一种方法是使用 alpha 混合,这使得每个点都略微透明。因此,在上面绘制更多点的区域显得更暗。

这很容易做到ggplot2

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

在此处输入图像描述

另一种处理这个问题的方便方法是(并且可能更适合您拥有的点数)是六边形分箱:

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

在此处输入图像描述

还有常规的旧矩形分箱(图片省略),它更像您的传统热图:

ggplot(df,aes(x=x,y=y)) + geom_bin2d()
于 2011-10-10T15:07:25.480 回答
86

几个不错的选择概述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:密度热图

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:六边形

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

在此处输入图像描述

于 2017-09-26T08:54:06.337 回答
63

你也可以看看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)

在此处输入图像描述

但是,如果您要控制第三个变量,则此功能会很糟糕。

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

在此处输入图像描述

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

smoothScatter(dat[2:3])

在此处输入图像描述

于 2013-04-20T15:24:59.763 回答
52

Alpha 混合也很容易与基本图形一起使用。

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

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

在此处输入图像描述

于 2011-10-11T14:29:25.653 回答
46

您还可以使用密度等高线 ( ggplot2):

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

在此处输入图像描述

或者将密度轮廓与 alpha 混合结合起来:

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

在此处输入图像描述

于 2011-10-10T16:18:45.557 回答
29

您可能会发现该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)

十六进制图

于 2011-10-11T13:32:22.820 回答
12

geom_pointdenistyggpointdensity(最近由 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()

于 2019-10-23T13:27:18.837 回答
2

我最喜欢的绘制此类数据的方法是这个问题中描述的方法-散点密度图。这个想法是做一个散点图,但通过它们的密度(粗略地说,该区域的重叠量)对点进行着色。

它同时:

  • 清楚地显示异常值的位置,并且
  • 揭示了情节密集区域中的任何结构。

以下是链接问题的最佳答案的结果:

散点密度图

于 2019-01-07T21:01:40.190 回答