R 中具有不平衡组大小的维恩图的整洁格式

Neat formatting for Venn diagram in R with unbalanced group sizes

我正在使用 VennDiagram R 包来尝试生成一个格式整齐的图表来比较两组。我过去已经成功地使用这个包来比较相对 similarly-sized 组。但是,现在我正在比较大小明显不同的组(第一组中独特元素的数量约为 3,600,第二组中独特元素的数量约为 60,重叠元素的数量约为 80)。

我现在的维恩图的外观是元素数量较多的组在其圆圈内显示此值,但两组交集的标签和第二组中的唯一元素太大以包含在图表的这些区域中,因此,它们显示在图表外部,并用一条线将它们连接到相关区域。我不喜欢这样的外观,并且想减小所有 3 个标签的大小,以便它们可以显示在图表的各自区域中。但是,在查看了相关的 documentation/examples 和出版物(Chen & Boutros 2011)之后,我仍然不清楚如何执行此操作。 (比如我看到参数允许指定图标题和副标题的字体大小,但是我没有看到在哪里可以指定标签的字体大小...)

我尝试了变通方法,例如尝试使标签不可见,以便我可以在单独的应用程序中手动添加它们,但这似乎不是一个选项...

对于如何减小标签的字体大小并指定这些标签出现在图表区域内而不是图表外部的任何建议,我们将不胜感激。谢谢!


更新:按照下面的要求,我提供我的示例代码:

library(VennDiagram);
library(grid);

Data <- read.csv('ExampleDataset_VennDiagram.csv')

Dataset1 <- Data[,1]
Dataset2 <- Data[,2]


    MyVennDiagram <- venn.diagram(
    x = list(
            A = Dataset1,
            B = Dataset2
        ),
    main = "",
    main.cex = NULL,
    filename = NULL,
    lwd = 2,
    fill = c("blue", "green"),
    alpha = 0.75,
    label.col = "black",
    cex=c(2,2,2),
    fontfamily = "sansserif",
    fontface = "bold",
    cat.col = c("blue", "green"),
    cat.cex = 0,
    cat.fontfamily = "serif",
    cat.fontface = "bold",
    cat.dist = c(0.05, 0.05),
    cat.pos = c(-20, 14),
    );

grid.newpage()
grid.draw(MyVennDiagram)

更新:根据下面误用的建议,使用 ext.text = FALSE 效果很好!

感谢所有为此主题做出贡献的人。

eulerr 库似乎可以生成 nice-looking 图表,并且肯定会成为我将来使用的资源 -- 感谢分享。

一个可能的解决方案是避免使用欧拉图。

为了说明您的问题,这里有一些数据:

  A = sample(1:1000, 500, replace = T)
  B = sample(1:10000, 50)

这是

得到的图
 library(VennDiagram);
 library(grid)

 MyVennDiagram = venn.diagram(
    x = list(
      A = A,
      B = B
    ),
    main = "",
    main.cex = NULL,
    filename = NULL,
    lwd = 2,
    fill = c("cornflowerblue", "pink"),
    alpha = 0.75,
    label.col = "black",
    cex=c(2,2,2),
    fontface = "plain",
    cat.col = c("cornflowerblue", "pink"),
    cat.cex = 0,
    cat.fontfamily = "serif",
    cat.fontface = "plain",
    cat.dist = c(0.05, 0.05),
    cat.pos = c(-20, 14),
    cat.default.pos = "text",
  )

  grid.newpage()
  grid.draw(MyVennDiagram)

避免使用 scaled = FALSE

缩放圆圈
  MyVennDiagram = venn.diagram(
    x = list(
      A = A,
      B = B
    ),
    main = "",
    main.cex = NULL,
    filename = NULL,
    lwd = 2,
    fill = c("cornflowerblue", "pink"),
    alpha = 0.75,
    label.col = "black",
    cex=c(2,2,2),
    fontface = "plain",
    cat.col = c("cornflowerblue", "pink"),
    cat.cex = 0,
    cat.fontfamily = "serif",
    cat.fontface = "plain",
    cat.dist = c(0.05, 0.05),
    cat.pos = c(-20, 14),
    cat.default.pos = "text",
    scaled = FALSE
  )

  grid.newpage()
  grid.draw(MyVennDiagram)

根据 user20650 的建议,最好的选择是在原始调用中使用 ext.text=FALSE

同时检查 library(eulerr) 它接受的输入有点不同,这里有一个例子:

library(eulerr)
library(tidyverse)
data.frame(dat = unique(c(A, B))) %>%
  mutate(A = dat %in% A,
         B = dat %in% B) %>%
  select(A, B) %>%
  euler() %>%
  eulerr:::plot.euler(counts = T)

根据 user20650 评论可接受的输入也是:

plot(euler(setNames(list(unique(A),unique(B)), c("A", "B"))), counts=TRUE)