分数太多的散点图

use*_*432 119 r scatter-plot

我试图绘制两个变量,其中N = 700K.问题是重叠太多,因此情节大部分都是黑色的固体块.是否有任何方法可以使用灰度"云",其中图的黑暗是区域中点数的函数?换句话说,我不希望显示单个点,而是希望绘图为"云",区域中的点数越多,该区域越暗.

jor*_*ran 141

处理此问题的一种方法是使用Alpha混合,这使得每个点都略微透明.因此,区域看起来更暗,其上绘制了更多的点.

这很容易做到ggplot2:

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

在此输入图像描述

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

ggplot(df,aes(x=x,y=y)) + stat_binhex()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

并且还有常规的旧矩形装箱(图像省略),这更像是传统的热图:

ggplot(df,aes(x=x,y=y)) + geom_bin2d()
Run Code Online (Sandbox Code Playgroud)


maj*_*jom 57

你也可以看一下这个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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是,如果您有第三个要控制的变量,则会出现这种情况.

# 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)  
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

smoothScatter(dat[2:3])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 第二个情节很棒! (3认同)
  • @ skan:您可以为此提出一个新问题。 (3认同)

Aar*_*ica 51

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

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

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

在此输入图像描述

  • 只是添加一些上下文,"#000000"是黑色,而在颜色末尾添加的"33"是不透明度 - 这里是33%. (20认同)
  • 小调; 数字是十六进制,所以33实际上是3/16不透明. (12认同)

Axe*_*man 51

以下几个不错选项的概述ggplot2:

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

选项A:透明点

o1 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05)
Run Code Online (Sandbox Code Playgroud)

选项B:添加密度轮廓

o2 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05) +
  geom_density_2d()
Run Code Online (Sandbox Code Playgroud)

选项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 = '.')
Run Code Online (Sandbox Code Playgroud)

选项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')
Run Code Online (Sandbox Code Playgroud)

选项E:hexbins

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

选项F:地毯

o6 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.1) +
  geom_rug(alpha = 0.01)
Run Code Online (Sandbox Code Playgroud)

结合一个图:

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

在此输入图像描述

  • 这是一个非常精心布置的答案,我认为应该得到更多的支持。 (2认同)

ROL*_*OLO 45

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

df <- data.frame(x = rnorm(15000),y=rnorm(15000))
ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者将密度轮廓与alpha混合组合:

ggplot(df,aes(x=x,y=y)) + 
    geom_point(colour="blue", alpha=0.2) + 
    geom_density2d(colour="black")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Osc*_*ñán 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)
Run Code Online (Sandbox Code Playgroud)

hexbinplot


jan*_*glx 11

geom_pointdenisty来自ggpointdensity(最近由 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()
Run Code Online (Sandbox Code Playgroud)