如何在维恩图中定义交点的颜色?

Mar*_*nes 3 r venn-diagram

我找到了很多关于如何在R中绘制维恩图的资源.Stack Overflow有很多.但是,我仍然无法按照我想要的方式绘制图表.以下面的代码为例:

library("VennDiagram")

A <- 1:4
B <- 3:6
d <- list(A, B)

vp <- venn.diagram(d, fill = c("white", "white"), alpha = 1, filename = NULL, 
  category.names=c("A", "B"))
grid.draw(vp)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我希望集合之间的交集是红色的.但是,如果我将任何白色颜色更改为红色,我会得到以下结果:

vp_red <- venn.diagram(d, fill = c("red", "white"), alpha = 1, filename = NULL, 
  category.names=c("A", "B"))
grid.draw(vp_red)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

那不是我想要的.我只希望交叉点是红色的.如果我更改alpha,这就是我得到的:

vp_alpha <- venn.diagram(d, fill = c("red", "white"), alpha = 0.5, filename = NULL, 
  category.names=c("A", "B"))
grid.draw(vp_alpha)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在我在路口有粉红色.这不是我想要的.我想要的是像维基百科的这张图片:

在此输入图像描述

我怎样才能做到这一点?也许VennDiagram包不能做,我需要一些其他的包,但我一直在测试不同的方法,我无法找到解决方案.

Hen*_*rik 6

我将展示两种不同的可能性.在第一个例子中,polyclip::polyclip用于获取交集.在第二个例子中,圆圈被转换为sp::SpatialPolygons,我们得到交叉点rgeos::gIntersection.然后我们重新绘制圆圈并填充交叉区域.


使用时生成的对象venn.diagram

" gList包含grid构成图表的对象的类"

因此,在这两种情况下,我们都可以从"vp"中获取相关数据.首先,检查str结构并列出grobs对象:

str(vp)
grid.ls()
# GRID.polygon.234
# GRID.polygon.235
# GRID.polygon.236 <~~ these are the empty circles
# GRID.polygon.237 <~~ $ col : chr "black"; $ fill: chr "transparent"
# GRID.text.238 <~~ labels
# GRID.text.239
# GRID.text.240
# GRID.text.241
# GRID.text.242 
Run Code Online (Sandbox Code Playgroud)

1. polyclip

获取x值和y值,并将它们放入以下所需的格式polyclip:

A <- list(list(x = as.vector(vp[[3]][[1]]), y = as.vector(vp[[3]][[2]])))
B <- list(list(x = as.vector(vp[[4]][[1]]), y = as.vector(vp[[4]][[2]])))
Run Code Online (Sandbox Code Playgroud)

找到交集点:

library(polyclip)
AintB <- polyclip(A, B)
Run Code Online (Sandbox Code Playgroud)

抓取标签:

ix <- sapply(vp, function(x) grepl("text", x$name, fixed = TRUE))
labs <- do.call(rbind.data.frame, lapply(vp[ix], `[`, c("x", "y", "label")))
Run Code Online (Sandbox Code Playgroud)

情节吧!

plot(c(0, 1), c(0, 1), type = "n", axes = FALSE, xlab = "", ylab = "")
polygon(A[[1]])
polygon(B[[1]])
polygon(AintB[[1]], col = "red")
text(x = labs$x, y = labs$y, labels = labs$label)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


2. SpatialPolygonsgIntersection

抓住圆圈的坐标:

# grab x- and y-values from first circle
x1 <- vp[[3]][["x"]]
y1 <- vp[[3]][["y"]]

# grab x- and y-values from second circle
x2 <- vp[[4]][["x"]]
y2 <- vp[[4]][["y"]]
Run Code Online (Sandbox Code Playgroud)

将点转换为SpatialPolygons并找到它们的交点:

library(sp)
library(rgeos)
p1 <- SpatialPolygons(list(Polygons(list(Polygon(cbind(x1, y1))), ID = 1))) 
p2 <- SpatialPolygons(list(Polygons(list(Polygon(cbind(x2, y2))), ID = 2))) 

ip <- gIntersection(p1, p2) 
Run Code Online (Sandbox Code Playgroud)

情节吧!

# plot circles 
plot(p1, xlim = range(c(x1, x2)), ylim = range(c(y1, y2))) 
plot(p2, add = TRUE) 

# plot intersection
plot(ip, add = TRUE, col = "red") 

# add labels (see above)
text(x = labs$x, y = labs$y, labels = labs$label)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


我很确定你可以直接grobs使用gridgridSVG包中的使用剪辑功能.