R 点过多的散点图

R 点过多的散点图,r,scatter-plot,R,Scatter Plot,我试图画出两个变量,其中N=700K。问题是有太多的重叠,因此绘图大部分变成一块黑色的实心块。有没有任何方法可以产生灰度“云”,其中绘图的黑暗度是区域中点数的函数?换句话说,我不希望显示单个点,而是希望绘图是一个“云”,一个区域中的点数越多,该区域越暗。解决这个问题的一种方法是alpha混合,它使每个点都略微透明。因此,区域越暗,其上绘制的点越多 这在ggplot2中很容易做到: df <- data.frame(x = rnorm(5000),y=rnorm(5000)) ggplot(

我试图画出两个变量,其中N=700K。问题是有太多的重叠,因此绘图大部分变成一块黑色的实心块。有没有任何方法可以产生灰度“云”,其中绘图的黑暗度是区域中点数的函数?换句话说,我不希望显示单个点,而是希望绘图是一个“云”,一个区域中的点数越多,该区域越暗。

解决这个问题的一种方法是alpha混合,它使每个点都略微透明。因此,区域越暗,其上绘制的点越多

这在
ggplot2
中很容易做到:

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)
df <- data.frame(x = rnorm(15000),y=rnorm(15000))
ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()
library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)

此外,还有常规的矩形装箱(图中省略),更像传统的热图:

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

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


您可能会发现
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)
库(hexbin)

mixdataAlpha混合也很容易使用基本图形

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

df您还可以查看
ggsubplot
包。这个包实现了Hadley Wickham在2011年提出的特性()

(在下文中,为了便于说明,我加入了“点”-层。)

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


概述了
ggplot2
中的几个好选项:

df <- data.frame(x = rnorm(5000),y=rnorm(5000))
ggplot(df,aes(x=x,y=y)) + geom_point(alpha = 0.3)
df <- data.frame(x = rnorm(15000),y=rnorm(15000))
ggplot(df,aes(x=x,y=y)) + geom_point() + geom_density2d()
library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)

我最喜欢的绘制此类数据的方法是-散射密度图中描述的方法。这个想法是做一个散点图,但要根据点的密度(粗略地说,就是该区域的重叠量)给点上色

它同时:

  • 清楚地显示异常值的位置,以及
  • 显示绘图密集区域中的任何结构
以下是链接问题的顶部答案的结果:


来自的geom_PointDenity
(最近由Lukas Kremer和Simon Anders(2019)开发)允许您同时可视化密度和单个数据点:

库(ggplot2)
#安装包(“ggpointdensity”)
图书馆(点密度)


df听起来像是在寻找热图:只需添加一点上下文,“#000000”是黑色,在颜色末尾添加的“33”是不透明度——这里是33%。感谢添加的解释。非常有意义。谢谢,亚伦和查理。小调;数字是十六进制的,因此33实际上是3/16不透明的。+1 hexbin是我的首选解决方案-它可以占用大量的点,然后安全地创建一个绘图。我不确定其他人是否会尝试生成一个绘图,而只是在事后对事物进行不同的着色。像hexbin这样的3D数据吗?第二个绘图很棒!如果我有3D数据怎么办?@skan:你可以就此提出一个新问题。不幸的是,包ggsubplot不再维护,并从cran repo中删除了…你知道可以使用另一个包生成上述前两个图吗?如果你使用旧版本的R&ggplot2,你应该能让它工作我怎么能改变颜色?我现在使用的是蓝色到黑色的比例,而我想要的是reg,绿色到蓝色的比例。@user1007742使用
scale\u fill\u gradient()。更改点的类型/形状如何?我得到六边形或正方形。我只想要简单的点。当我使用geom_point()时,它会给我一个错误。@user1007742好吧,它被称为“六边形装箱”是有原因的它不是绘制“点”,而是将整个区域划分为六边形(或矩形)容器,然后根据容器中的点数量对容器进行着色。所以简单的回答是“你不能”。如果你想要不同的形状,你必须使用
geom_point()
并绘制每个点。如果我有3D数据呢?这是一个非常好的答案,我认为值得更多的投票。在scale_fill_viridis_c()中给我一个错误:找不到函数“scale_fill_viridis_c”更新的ggplot2,重新安装ggplot2并重新加载ggplot2。我没有纠正错误。单独安装的“viridis”软件包,允许我使用“scale_fill_viridis”功能,但不使用“scale_fill_viridis_c”功能,这仍然会产生相同的错误哦,我相信你。没有问题。只是想找出错误的根源。这也是我最喜欢的方法。有关如何实现这一点,请参见
R
smoothScatter(dat[2:3])
library(ggplot2)
x <- rnorm(n = 10000)
y <- rnorm(n = 10000, sd=2) + x
df <- data.frame(x, y)
o1 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05)
o2 <- ggplot(df, aes(x, y)) +
  geom_point(alpha = 0.05) +
  geom_density_2d()
o3 <- ggplot(df, aes(x, y)) +
  stat_density_2d(aes(fill = stat(level)), geom = 'polygon') +
  scale_fill_viridis_c(name = "density") +
  geom_point(shape = '.')
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')
o5 <- ggplot(df, aes(x, y)) +
  geom_hex() +
  scale_fill_viridis_c() +
  geom_point(shape = '.', col = 'white')
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'
)