R散点图:符号颜色代表重叠点的数量
Posted
技术标签:
【中文标题】R散点图:符号颜色代表重叠点的数量【英文标题】:R Scatter Plot: symbol color represents number of overlapping points 【发布时间】:2013-06-10 05:51:16 【问题描述】:当许多点重叠时,散点图可能很难解释,因为这种重叠会掩盖特定区域中的数据密度。一种解决方案是为绘制点使用半透明颜色,以便不透明区域表示在这些坐标中存在许多观察值。
以下是我在 R 中的黑白解决方案示例:
MyGray <- rgb(t(col2rgb("black")), alpha=50, maxColorValue=255)
x1 <- rnorm(n=1E3, sd=2)
x2 <- x1*1.2 + rnorm(n=1E3, sd=2)
dev.new(width=3.5, height=5)
par(mfrow=c(2,1), mar=c(2.5,2.5,0.5,0.5), ps=10, cex=1.15)
plot(x1, x2, ylab="", xlab="", pch=20, col=MyGray)
plot(x1, x2, ylab="", xlab="", pch=20, col="black")
但是,我最近遇到了this article in PNAS,它采用了类似的方法,但使用热图着色而不是不透明度作为重叠点数的指标。这篇文章是开放存取的,因此任何人都可以下载 .pdf 并查看图 1,其中包含我要创建的图表的相关示例。本文的方法部分表明分析是在Matlab中完成的。
为方便起见,这里是上述文章中图 1 的一小部分:
如何在 R 中创建使用颜色而不是不透明度作为点密度指标的散点图?
对于初学者,R 用户可以使用函数 tim.colors()
访问 install.packages("fields")
库中的这个 Matlab 颜色方案。
有没有一种简单的方法可以制作类似于上述文章的图 1 的图形,但在 R 中?谢谢!
【问题讨论】:
【参考方案1】:一种选择是使用densCols()
在每个点提取内核密度。将这些密度映射到所需的色带,并按增加局部密度的顺序绘制点,您可以获得与链接文章中的图非常相似的图。
## Data in a data.frame
x1 <- rnorm(n=1E3, sd=2)
x2 <- x1*1.2 + rnorm(n=1E3, sd=2)
df <- data.frame(x1,x2)
## Use densCols() output to get density at each point
x <- densCols(x1,x2, colramp=colorRampPalette(c("black", "white")))
df$dens <- col2rgb(x)[1,] + 1L
## Map densities to colors
cols <- colorRampPalette(c("#000099", "#00FEFF", "#45FE4F",
"#FCFF00", "#FF9400", "#FF3100"))(256)
df$col <- cols[df$dens]
## Plot it, reordering rows so that densest points are plotted on top
plot(x2~x1, data=df[order(df$dens),], pch=20, col=col, cex=2)
【讨论】:
这看起来正是我所希望的答案...谢谢! @JoshOBrien:这太棒了!两个问题:1)您如何在答案中添加图像? 2) 如何在此处添加图例? @Shambho -- (1) 您可能需要至少 100 个声望,之后您将在标记组合框上看到一个图像图标。 (2) AFAIK 没有预先打包的方式。我会使用layout(matrix(1:2,ncol=2),width=c(75,25))
之类的东西将绘图设备分成两个绘图区域,将上面的图放置在第一个区域中,将颜色条放在第二个区域中。对于彩条,我可能会先从给定here 的color.bar()
函数开始,然后先从中删除对dev.new()
的调用。
@Shambho -- 为了让它恰到好处,您可能想与par(mar=)
等人一起玩一下。 (3) 很高兴你也喜欢这个答案。在我在这里给出的 900 多个答案中,这绝对是我个人最喜欢的 5-10 个!
鼓舞人心!再次感谢!【参考方案2】:
您可以通过进行六边形分箱获得类似的效果,将区域划分为六边形,根据六边形中的点数为每个六边形着色。 hexbin 包有执行此操作的函数,ggplot2 包中也有函数。
【讨论】:
ggplot2 中的什么函数可以做到这一点? @rbatt,看看stat_binhex
。【参考方案3】:
您可以为此使用smoothScatter
。
colramp = colorRampPalette(c('white', 'blue', 'green', 'yellow', 'red'))
smoothScatter(x1, x2, colramp=colramp)
【讨论】:
感谢您的回复——这大约是正确的想法,但我想避免点的平滑。我尝试使用带宽等,但似乎此功能无法保持单个点。 不错的发现!不知道这个或我刚才在回答中使用的相关densCols()
函数。以上是关于R散点图:符号颜色代表重叠点的数量的主要内容,如果未能解决你的问题,请参考以下文章
R语言散点图可视化:自定义标题和标签拟合回归线lowess为散点图添加平滑拟合线修改散点图中点颜色和点符号分组散点图添加图例pairs可视化散点图矩阵ggplt2可视化lattice