【问题标题】:Adding legend to venn diagram向维恩图添加图例
【发布时间】:2017-04-10 13:14:05
【问题描述】:

我正在使用库VennDiagram 来绘制维恩图。但是这个函数没有添加图例的功能,并且集合名称显示在集合本身上或附近。

library(VennDiagram)
x <- list(c(1,2,3,4,5),c(4,5,6,7,8,9,10))
venn.diagram(x,filename="test.png",fill=c("#80b1d3","#b3de69"),
             category.names=c("A","B"),height=500,width=500,res=150)

对于许多集合,过度绘制名称是一个问题,我希望有一个图例。该功能建立在网格图形上,我不知道网格绘图是如何工作的。但是,无论如何我都在尝试添加一个图例。

查看 venn.diagram 函数,我发现最终绘制的对象是 grob.list,它是一个 gList 对象,它使用 grid.draw() 绘制。

png(filename = filename, height = height, width = width, 
    units = units, res = resolution)
grid.draw(grob.list)
dev.off()

我发现我可以通过使用下面的代码修改venn.diagram 函数来创建图例。

cols <- c("#80b1d3","#b3de69")
lg <- legendGrob(labels=category.names, pch=rep(19,length(category.names)),
                 gp=gpar(col=cols, fill="gray"),byrow=TRUE)

绘制对象lg

png(filename = filename, height = height, width = width, 
    units = units, res = resolution)
grid.draw(lg)
dev.off()

获得传奇

如何以可用的方式将维恩图 (gList) 和图例 (gTree,grob) 放在一起?我希望得到类似基本情节风格的东西:

或 ggplot 样式

【问题讨论】:

    标签: r r-grid


    【解决方案1】:

    如果允许使用VennDiagram以外的其他包,我建议使用eulerr包的以下代码:

    library(eulerr)
    
    vd <- euler(c(A = 5, B = 3, "A&B" = 2))
    plot(vd, counts = TRUE,lwd = 2,
         fill=c("#80b1d3","#b3de69"),
         opacity = .7,
         key = list( space= "right", columns=1))
    

    您可以使用key 定义图例位置和外观。

    【讨论】:

      【解决方案2】:

      如果您想继续使用VennDiagram 包并在途中学习一点grid

      准备图表和图例

      library(VennDiagram)
      x <- list(c(1,2,3,4,5),c(4,5,6,7,8,9,10))
      diag <- venn.diagram(x,NULL,fill=c("#80b1d3","#b3de69"),
                   category.names=c("A","B"),height=500,width=500,res=150)
      
      
      cols <- c("#80b1d3","#b3de69")
      lg <- legendGrob(labels=c("A","B"), pch=rep(19,length(c("A","B"))),
                       gp=gpar(col=cols, fill="gray"),
                       byrow=TRUE)
      

      将图表转换为 gTree

      (如果有人知道,我很乐意找到更好的方法)

      library(gridExtra)
      
      g <- gTree(children = gList(diag))
      

      并排绘制两个gTrees

      gridExtra::grid.arrange(g, lg, ncol = 2, widths = c(4,1))
      

      或者一个在另一个之上

      grid.arrange(g, lg, nrow = 2, heights = c(4,1))
      

      【讨论】:

        【解决方案3】:

        我也找到了解决方案,但维恩图区域不是正方形纵横比。而且图例的间距也不理想。

        library(gridGraphics)
        
        png("test.png",height=600,width=600)
        grab_grob <- function(){grid.echo();grid.grab()}
        grid.draw(diag)
        g <- grab_grob()
        grid.arrange(g,lg,ncol=2,widths=grid::unit(c(0.7,0.3),"npc"))
        dev.off()
        

        【讨论】:

          猜你喜欢
          • 2014-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-24
          • 1970-01-01
          • 2013-03-22
          相关资源
          最近更新 更多