如何将数据椭圆叠加在 ggplot2 散点图上?

Posted

技术标签:

【中文标题】如何将数据椭圆叠加在 ggplot2 散点图上?【英文标题】:How can a data ellipse be superimposed on a ggplot2 scatterplot? 【发布时间】:2011-01-24 17:20:03 【问题描述】:

我有一个 R 函数,它为散点图生成 95% 的置信椭圆。输出如下所示,每个椭圆(50 行)默认为 50 个点:

           [,1]         [,2]
 [1,]  0.097733810  0.044957994
 [2,]  0.084433494  0.050337990
 [3,]  0.069746783  0.054891438

我想在ggplot2 散点图上为一个称为“站点”的因子的每个级别叠加多个这样的椭圆,该散点图由以下命令生成:

> plat1 <- ggplot(mapping=aes(shape=site, size=geom), shape=factor(site)); plat1 + geom_point(aes(x=PC1.1,y=PC2.1))

这是在一个名为 dflat 的数据集上运行的,如下所示:

site      geom         PC1.1        PC2.1       PC3.1        PC1.2       PC2.2
1 Buhlen 1259.5649 -0.0387975838 -0.022889782  0.01355317  0.008705276  0.02441577
2 Buhlen  653.6607 -0.0009398704 -0.013076251  0.02898955 -0.001345149  0.03133990

结果很好,但是当我尝试添加椭圆时(假设这个网站,称为“Buhlen”):

> plat1 + geom_point(aes(x=PC1.1,y=PC2.1)) + geom_path(data=subset(dflat, site="Buhlen"),mapping=aes(x=ELLI(PC1.1,PC2.1)[,1],y=ELLI(PC1.1,PC2.1)[,2]))

我收到一条错误消息:"Error in data.frame(x = c(0.0977338099339815, 0.0844334944904515, 0.0697467834016782, : arguments imply differing number of rows: 50, 211

我过去曾设法解决此问题,但我不记得如何解决了。似乎 geom_path 依赖于相同的点而不是绘制新的点。任何帮助将不胜感激。

【问题讨论】:

您是否尝试将默认值 50 点更改为 211?它有效吗?您可能需要在函数中添加另一个参数(点数) 您好,感谢您的快速回复。该功能可以更改点数,我确实尝试了211点。它产生了一个奇怪的非常厚的圆圈。我认为它不是首先对数据进行子集化,它应该能够用 50 个点绘制它 - 至少从文档中,您可以在同一个图上使用不同的数据集,所以自然地,不同数量的点应该是也可以。 如果您提供一个最小的可重现示例,我们会更容易。 aes调用中的东西应该是变量名。 实际上有人为此实现了 ggplot2 统计信息(发布在我的回答中)。 【参考方案1】:

也许这可以帮助你:

#bootstrap
set.seed(101)
n <- 1000
x <- rnorm(n, mean=2)
y <- 1.5 + 0.4*x + rnorm(n)
df <- data.frame(x=x, y=y, group="A")
x <- rnorm(n, mean=2)
y <- 1.5*x + 0.4 + rnorm(n)
df <- rbind(df, data.frame(x=x, y=y, group="B"))

#calculating ellipses
library(ellipse)
df_ell <- data.frame()
for(g in levels(df$group))
df_ell <- rbind(df_ell, cbind(as.data.frame(with(df[df$group==g,], ellipse(cor(x, y), 
                                         scale=c(sd(x),sd(y)), 
                                         centre=c(mean(x),mean(y))))),group=g))

#drawing
library(ggplot2)
p <- ggplot(data=df, aes(x=x, y=y,colour=group)) + geom_point(size=1.5, alpha=.6) +
  geom_path(data=df_ell, aes(x=x, y=y,colour=group), size=1, linetype=2)

输出如下所示:

Here 是更复杂的例子。

【讨论】:

如果关闭颜色,可能会出现奇怪的行为。特别是在绘图调用中没有color=... 时,椭圆的边缘之间会画一条线。这可以通过group=group 避免(使用不合理的变量名)。【参考方案2】:

Keelan Evanini、Ingrid Rosenfelder 和 Josef Fruehwald (JoFrhwld@gmail.com) 创建了 95% 置信区间椭圆的 ggplot2 stat 实现(以及在 ggplot2 中绘制椭圆的更简单方法):

GitHub stat-ellipse.R

their site

您可以将其用作:

library(ggplot2)
library(devtools)
library(digest)
source_url("https://raw.github.com/low-decarie/FAAV/master/r/stat-ellipse.R")    
qplot(data=df, x=x, y=y, colour=colour)+stat_ellipse()

创建数据

set.seed(101)
n <- 1000
x <- rnorm(n, mean=2)
y <- 1.5 + 0.4*x + rnorm(n)
colour <- sample(c("first", "second"), size=n, replace=T)
df <- data.frame(x=x, y=y, colour=colour)

【讨论】:

新版本的 ggplot2 似乎破坏了 stat_ellipse,因为它逐渐弃用了某些其他有利于 S3 的方法。 我已经创建了一个修复程序,现在可以在答案中找到。 stat_ellipse() 似乎与 ggplot2 3.2.0 一起工作得很好(目前是 CRAN 中的最新版本。)

以上是关于如何将数据椭圆叠加在 ggplot2 散点图上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中叠加散点图?

R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_ellipse函数在数据簇或数据分组的数据点周围添加椭圆(ellipse)进行注释(对椭圆包围的区域进行着色为阴影区域)

在散点图上叠加线函数 - seaborn

如何在 ggplot2 散点图上覆盖 lm 对象的线

python plt可视化时,怎么实现散点图或者其他图画图时,数据中相同点越多该点画在图上的颜色越深?

如何在ggplot2中更改散点图的颜色