【问题标题】:Manual Ordering of Sets in R/VennDiagram在 R/VennDiagram 中手动排序集合
【发布时间】:2014-05-15 20:16:39
【问题描述】:

我使用 VennDiagram 来说明不同客户群之间的重叠——总体上和特定子细分市场的重叠。我遇到的问题是,VennDiagram 似乎自动将输出中的圆圈从最大到最小排序。在这两个图中,我创建的两个总体的相对大小正在翻转,因此在输出中图表的总体/颜色是相反的。我想将这些并排放在一个文档中,人口顺序的翻转使并排比较有点混乱。

每个示例代码如下 - 有没有办法手动强制输出中的集合排序,以便人口按相同的顺序排序?

谢谢你-

venn.plot <- venn.diagram(
x = list(
"AD" = 1:703814,
"WM" = 672279:1086933
),
height = 4000 ,
width = 4000 ,
units = 'px',
filename = "H:\\AD_vs_WM_Total.tiff",
scaled = TRUE,
ext.text = TRUE,
lwd = 1, 
ext.line.lwd = 1,
ext.dist = -0.15,
ext.length = 0.9,
ext.pos = -4,
fill = c("cornflowerblue", "darkorchid1"),
cex = 1.5,
cat.cex = 2,
cat.col = c("black", "black"),
cat.pos = c(120,300) ,
rotation.degree = 45,
main = "AD vs. WM",
sub = "Total Populations",
main.cex = 2,
sub.cex = 1.5
);

venn.plot <- venn.diagram(
x = list(
"AD" = 1:183727,
"WM" = 173073:383052
),
height = 4000 ,
width = 4000 ,
units = 'px',
filename = "H:\\AD_vs_WM_Target.tiff",
scaled = TRUE,
ext.text = TRUE,
lwd = 1, 
ext.line.lwd = 1,
ext.dist = -0.15,
ext.length = 0.9,
ext.pos = -4,
fill = c("cornflowerblue", "darkorchid1"),
cex = 1.5,
cat.cex = 2,
cat.col = c("black", "black"),
cat.pos = c(120,300) ,
rotation.degree = 45,
main = "AD vs. WM",
sub = "Target Populations",
main.cex = 2,
sub.cex = 1.5
);

【问题讨论】:

    标签: r venn-diagram


    【解决方案1】:

    使用 if 语句查看第二组是否大于第一组。如果是,则添加 180 度旋转。

    【讨论】:

      【解决方案2】:

      可以通过修改draw.pairwise.venn()函数中的gList对象来解决。 venn.diagram() 是许多 draw.____.venn() 函数的包装器(例如:pairwise, quad, quintuple, single 等)

      在您的示例中,使用 if 语句查找人口标签中的任何开关。如果为真,则更改inverted = TRUE 并切换标签。

      同时使用ind = FALSE 来阻止绘制图表。

      我使用您的示例来展示您在问题中发布的两个维恩图之一的解决方案。

      packageVersion("VennDiagram")
      # [1] ‘1.6.17’
      
      AD <-  1:703814
      WM <-  672279:1086933
      overlap <- calculate.overlap(x = list('AD' = AD, 'WM' = WM))
      area_overlap <- sapply(overlap, length)
      
      g <- draw.pairwise.venn(area1 = area_overlap[1],
                              area2 = area_overlap[2],
                              cross.area = area_overlap[3],
                              category = c("AD", "WM"),
                              ind = FALSE,
                              inverted = FALSE,
                              scaled = TRUE,
                              ext.text = TRUE,
                              lwd = 1, 
                              ext.line.lwd = 1,
                              ext.dist = -0.15,
                              ext.length = 0.9,
                              ext.pos = -4,
                              fill = c("cornflowerblue", "darkorchid1"),
                              cex = 6,
                              cat.cex = 6,
                              cat.col = c("black", "black"),
                              cat.dist = c(-0.16, -0.09),
                              cat.pos = c(0,10),
                              rotation.degree = 35)
      
      # check for switch in labels
      if(area_overlap[1] != (as.integer(g[[5]]$label) + as.integer(g[[7]]$label)) && area_overlap[2] !=  (as.integer(g[[6]]$label) + as.integer(g[[7]]$label))){
        # change inverted to TRUE
        g <- draw.pairwise.venn(area1 = area_overlap[1],
                                area2 = area_overlap[2],
                                cross.area = area_overlap[3],
                                category = c("AD", "WM"),
                                ind = FALSE,
                                inverted = TRUE,
                                scaled = TRUE,
                                ext.text = TRUE,
                                lwd = 1, 
                                ext.line.lwd = 1,
                                ext.dist = -0.15,
                                ext.length = 0.9,
                                ext.pos = -4,
                                fill = c("cornflowerblue", "darkorchid1"),
                                cex = 6,
                                cat.cex = 6,
                                cat.col = c("black", "black"),
                                cat.dist = c(-0.16, -0.09),
                                cat.pos = c(0,10),
                                rotation.degree = 35)
      
        # switch labels
        tmp_var      <- g[[6]]$label
        g[[6]]$label <- g[[5]]$label
        g[[5]]$label <- tmp_var
        rm(tmp_var)
      }
      
      jpeg("AD_vs_WM_Total_new.jpg", width = 1200, height = 1200)
      plot.new()
      title(main = "AD vs. WM", sub = "Total Populations", cex.main = 6, cex.sub = 5, line = -4, outer = TRUE)
      grid.draw(g)
      dev.off()
      

      【讨论】:

        【解决方案3】:

        If 语句可以解决问题,但对于这么小的任务,它似乎有点笨拙。我认为您可以简单地将以下行添加到您的脚本中

        inverted=length(x$AD) < length(x$WM)
        

        这应该可以解决问题(当 WM 比 AD 语句长并且情节反转时)。

        【讨论】:

          【解决方案4】:

          这对我不起作用。圆圈中的数据翻转,但圆圈上的标签保持不变。不过,rotation 方法奏效了。

          【讨论】:

            猜你喜欢
            • 2013-04-30
            • 2022-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多