R中的四重维恩图?

3
我正在尝试在R中制作一个四维文氏图。我有以下数据需要放入图表:

enter image description here

请问有人能给予建议如何制作吗?我尝试使用函数vennDiagram(),但是它不适用于四维图表。
我还尝试使用包VennDiagram,但是很难将数据“分配”到图表的正确位置。我正在使用以下代码:
library (VennDiagram)
venn.diagram(
    x=list(
    I=c(1:18,19:31,32:119,125:129,130:192,193:144,145:326,327:373),
    VI=c(516:542,510:515,420:497,498:509,145:326,327:373,130:192,193:144),
    II=c(19:31,32:119,145:326,327:373,374:378,378:419,420:497,498:509),
    III=c(506:509,378:419,32:119,125:129,130:192,145:326,420:497,510:515)
    ),
    filename = "4Way_Venn.tiff",
    col = "black",
    lty = "dotted",
    lwd = 4,
    fill = c("cornflowerblue", "green", "yellow", "darkorchid1"),
    alpha = 0.50,
    label.col = c("orange", "white", "darkorchid4", "white", "white", "white", 
                  "white", "white", "darkblue", "white", "white", "white", 
                  "white", "darkgreen", "white"),
    cex = 2.5,
    fontfamily = "serif",
    fontface = "bold",
    cat.col = c("darkblue", "darkgreen", "orange", "darkorchid4"),
    cat.cex = 2.5,
    cat.fontfamily = "serif"
    );

有人可以帮我吗?也许有比使用VennDiagram包更简单的解决方案。


Vennerable不支持R吗?我用Python和gnuplot编写了一个解决方案。很乐意分享。 - tommy.carstensen
4个回答

4

我可能理解有误,但是我不确定您想如何使用这些“counts”来制作您的文氏图?从列“c1”到“c4”,您可以使用venneuler软件包非常容易地制作文氏图:

require(venneuler)
#here I replicate your data
#because it's repeatable, you can use `rep` function to generate it
c1 <- rep(c(0,1),each=8)
c2 <- rep(c(0,1),each=4,times=2)
c3 <- rep(c(0,1),each=2,times=4)
c4 <- rep(c(0,1),times=8)
#put your data into matrix
m <- as.matrix(data.frame(C1=c1,C2=c2,C3=c3,C4=c4))
#plot it
v = venneuler(m)
plot(v)

enter image description here


2
计数是每个情况发生的次数,它是数据的摘要,并且应该在图表中呈现。例如,数据中有26次所有c1、c2、c3和c4的值都为0。 - Peiska
@Peiska:好的,我明白你的意思了。等我有时间会尝试修改它。 - Geek On Acid
我认为这并不能解决问题,但也许 http://stackoverflow.com/questions/30638610/how-to-draw-venn-diagram-using-6-sets/31148761#31148761 会有所帮助。 - timelyportfolio

3
请注意:我曾经在几个支持此功能的软件包中尝试构建4(及以上)路维恩图,但至少有一种情况下子空间没有被正确绘制。例如,一个完全包含在另一个子集中的子集被绘制时,其部分区域会延伸到父级子集之外。不幸的是,我不记得哪个软件包会出现这种情况。
因此,我的答案是:尝试使用venneuler,如GOA所说,请尝试require(sos); ???venn,并确保仔细测试每个软件包,以确保它正确地渲染交集。

1

使用新版本的nVennR包(0.2.0),您可以有两种方法实现:

1)根据您提供的代码,

myV <- plotVenn(list(I=c(1:18,19:31,32:119,125:129,130:192,193:144,145:326,327:373), 
IV=c(516:542,510:515,420:497,498:509,145:326,327:373,130:192,193:144), 
II=c(19:31,32:119,145:326,327:373,374:378,378:419,420:497,498:509), 
III=c(506:509,378:419,32:119,125:129,130:192,145:326,420:497,510:515)),
setColors = c("cornflowerblue", "green", "yellow", "darkorchid1"), borderWidth=3, opacity=0.2)

Result

2) 直接从第一个列表中,

myV2 <- createVennObj(nSets = 4, sNames = c("c1", "c2", "c3", "c4"), sSizes = c(26, 27, 4, 6, 5, 12, 42, 78, 18, 52, 4, 63, 13, 47, 88, 182))
myV2 <- plotVenn(nVennObj = myV2)

Result2

第一种方法的优点之一是可以查询每个区域中的元素:
getVennRegion(myV, c("I", "III"))
[1] 125 126 127 128 129

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接