【发布时间】:2015-03-28 04:48:44
【问题描述】:
一位学生问我是否可以使用 R 重新创建类似于下面的情节:
这是来自this paper....
这类东西不是我的专长,但使用以下代码,我能够创建 95% 的 CI 椭圆并用 geom_polygon() 绘制它们。我使用 rphylopic 包从系统发育库中抓取的图像填充了图像。
#example data/ellipses
set.seed(101)
n <- 1000
x1 <- rnorm(n, mean=2)
y1 <- 1.75 + 0.4*x1 + rnorm(n)
df <- data.frame(x=x1, y=y1, group="A")
x2 <- rnorm(n, mean=8)
y2 <- 0.7*x2 + 2 + rnorm(n)
df <- rbind(df, data.frame(x=x2, y=y2, group="B"))
x3 <- rnorm(n, mean=6)
y3 <- x3 - 5 - rnorm(n)
df <- rbind(df, data.frame(x=x3, y=y3, group="C"))
#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_polygon(data=df_ell, aes(x=x, y=y,colour=group, fill=group), alpha=0.1, size=1, linetype=1)
### get center points of ellipses
library(dplyr)
ell_center <- df_ell %>% group_by(group) %>% summarise(x=mean(x), y=mean(y))
### animal images
library(rphylopic)
lion <- get_image("e2015ba3-4f7e-4950-9bde-005e8678d77b", size = "512")[[1]]
mouse <- get_image("6b2b98f6-f879-445f-9ac2-2c2563157025", size="512")[[1]]
bug <- get_image("136edfe2-2731-4acd-9a05-907262dd1311", size="512")[[1]]
### overlay images on center points
p + add_phylopic(lion, alpha=0.9, x=ell_center[[1,2]], y=ell_center[[1,3]], ysize=2, color="firebrick1") +
add_phylopic(mouse, alpha=1, x=ell_center[[2,2]], y=ell_center[[2,3]], ysize=2, color="darkgreen") +
add_phylopic(bug, alpha=0.9, x=ell_center[[3,2]], y=ell_center[[3,3]], ysize=2, color="mediumblue") +
theme_bw()
这给出了以下内容:
这没关系,但我真正想做的是将图像直接添加到 geom_polygon 的“填充”命令中。这可能吗 ?
【问题讨论】:
-
我想官方的回答是“不可能”(Hadley's answer)。但是,@baptiste here 的最新回答可能会有所帮助。
-
这不是您要问的,而是本着“正确工作的正确工具”的精神:我将在 R 中制作基础图,并在其背后提供数据。然后我会使用 Photoshop,或者它是免费的、开源的,几乎等同于 GIMP。然后创建不同的图层并调整它们的透明度,让椭圆形通过。