R语言 如何创建具有比例大小的三重维恩图

ddrv8njm  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(144)

我试图绘制一个三重维恩图,但它的大小不成比例。下面是代码。有没有可能使它的大小成比例?

library(VennDiagram)

grid.newpage()
draw.triple.venn(area1=2125, area2=805, area3=387, 
                 n12=805, n23=385, n13=387, n123=385, 
                 category=c("All Extractables","CERAPP","ToxCast"),
                 col="Black",fill=c("White","Red","Yellow"),
                 cex = 3, 
                 cat.cex = 2)
huus2vyu

huus2vyu1#

如果你的意思是你想根据它们包含的值来缩放圆(例如,圆1的大小是圆2的大小的2125/805),我认为你必须在调用时将euler.dscaled都作为TRUE传递。而且,由于缩放通常是禁用的,因为可能会产生误导性的图表,所以必须将overrideTriple设置为某个值以允许缩放。
因此,运行下面的代码(适合使用rscript运行,并给予我足够的时间来捕获输出):

library(grid)
library(VennDiagram)

windows()
grid.newpage()
overrideTriple = TRUE
draw.triple.venn(
    area1=200, area2=300, area3=400, n12=20, n23=30, n13=40, n123=10, 
    category=c("#1","#2","#3"),
    col="Black",fill=c("White","Red","Yellow"),
    cex=3, cat.cex=2, euler.d=TRUE, scaled=TRUE)
Sys.sleep(20)

会给予你:

然而,关于你关于 specific 值大小不正确的评论,你给出的代码是(同样,设置为rscript和捕获):

library(grid)
library(VennDiagram)

windows()
grid.newpage()
overrideTriple = TRUE
draw.triple.venn(
    area1=2125, area2=805, area3=387,
    n12=805, n23=385, n13=387,
    n123=385, 
    category=c("#1","#2","#3"), 
    col="Black",fill=c("White","Red","Yellow"),
    cex=3, cat.cex=2,
    euler.d=TRUE, scaled=TRUE)
Sys.sleep(20)

这产生了:

在这个渲染中,集合#2和#3正确地 * 在 * #1内,因为它们是完全包含的值(area2 == n12area3 == n13)。图中#1明显更大,但这可能是显示包容性的假象,而不是基于值的实际大小。
很明显,2号和3号是以相同的大小渲染的,尽管一个应该是另一个的两倍。所以你是正确的,这些价值观不起作用。文档包含了这个小片段,但没有对特殊情况进行进一步的阐述。
euler.d == TRUE的19种特殊情况作了欧拉图。
如果你仔细想想,有些情况显然是不可能用圆圈来渲染的。考虑#2和#3的并集是否是#1的整体(即,不存在“仅#1”的项目)。两个较小的圆完全包含在一个较大的圆中,不可能具有与较大的圆相同的面积(尽管矩形可能适用于这种情况)。
还有其他情况,例如1000的外部集合包含500和499的两个内部集合,内部集合之间没有重叠。
由于diameter = 2√(area/π),两个内圆的直径约为25个单位,外圆的直径约为36个单位。我已经有一段时间没有做几何了,但我很难弄清楚如何将两个内圈放在外圈内而不重叠:-)
深入挖掘,我们可以去检查VennDiagram的实际 * 代码 *。决定这些特殊情况的部分可以在decide.special.case.R中找到,它被从draw.triple.venn.R调用。
后者是它根据发现的特殊情况选择draw.sp.case.scaleddraw.sp.case.preprocess之一作为要调用的函数。这19种特殊情况是,决定它们是缩放还是预处理(注意其他情况既不缩放也不预处理):

  • 022AAAO022AAOO023032120121AO122AAOO130将缩放。
  • 100033011A021AA011O112AA010110001012AA111A不会缩放。

前三位数字在这里很重要,它们是(来自评论):

  • 第一位数字是缺失的三重重叠的数量(0-1)。
  • 第二位数字是缺失的双重重叠的数量(0-3)。
  • 第三位数字是缺失的不同(非重叠)部分的数量(0-3)。

解决这个问题的代码有点复杂。使用的a1..a7变量与下图(理想)中的值一致。例如,图中的1表示a1,即#1中的填充物不在任何重叠中:

在您的数据中,这些 * 实际 * 值设置如下,右侧的字母表示它是(n)非重叠区域,(d)双重叠区域,还是(t)三重叠区域:

a1 <- area1 - n12 - n13 + n123; # 2125 - 805 - 387 - 385 = 548 n
a3 <- area2 - n12 - n23 + n123; #  805 - 805 - 385 + 385 =   0 n
a7 <- area3 - n13 - n23 + n123; #  387 - 387 - 385 + 385 =   0 n

a2 <- n12 - n123;               #  805 - 385             = 420 d
a4 <- n13 - n123;               #  387 - 385             =   2 d
a6 <- n23 - n123;               #  385 - 385             =   0 d

a5 <- n123;                     #  385                   = 385 t

通过这些值,您可以看到没有缺失三重重叠,一个缺失双重重叠a6,以及两个缺失非重叠a3a7。这将给予你的数字012,这可能会被012AA的情况下,不 * 不 * 规模捕获。
这些字母在这里是不相关的,因为在特殊情况下,没有什么不是012AA的开始012。所以它要么不能缩放,因为它不是一个特例,要么不能缩放,因为它是一个特殊的情况,特别标记为“不可缩放”。
如果在这种情况下你真的需要扩展,显然还有其他人们建议的软件包可以做得更好(比如VenerablenVennR)。我没有这些经验,所以不能推荐他们自己,但你可能想看看他们。

相关问题