【问题标题】:Venn Diagram with Item labels带有项目标签的维恩图
【发布时间】:2014-09-21 02:09:17
【问题描述】:

假设我有两个向量

foo <- c('a','b','c','d')
baa <- c('a','e','f','g')

有谁知道生成维恩图的方法,但可以在图中可视化矢量项。

像这样? (在PowerPoint中制作)

【问题讨论】:

  • venn.diagram 来自VennDiagram package 是基于grid 图形和函数返回对象。这允许您进入并手动更改标签以显示项目而不是计数。
  • 你用venneuler包研究过这个excellent example吗?

标签: r venn-diagram


【解决方案1】:

使用VennDiagram 包中的venn.diagram 函数的快速解决方案。标签(计数)在函数中是硬编码的,因此不能使用函数参数进行更改。但是对于像这样的简单示例,您可以自己更改grobs

library(VennDiagram)

# your data
foo <- c('a','b','c','d')
baa <- c('a','e','f','g')

# Generate plot
v <- venn.diagram(list(foo=foo, baa=baa),
                  fill = c("orange", "blue"),
                  alpha = c(0.5, 0.5), cat.cex = 1.5, cex=1.5,
                  filename=NULL)

# have a look at the default plot
grid.newpage()
grid.draw(v)

# have a look at the names in the plot object v
lapply(v,  names)
# We are interested in the labels
lapply(v, function(i) i$label)

# Over-write labels (5 to 7 chosen by manual check of labels)
# in foo only
v[[5]]$label  <- paste(setdiff(foo, baa), collapse="\n")  
# in baa only
v[[6]]$label <- paste(setdiff(baa, foo)  , collapse="\n")  
# intesection
v[[7]]$label <- paste(intersect(foo, baa), collapse="\n")  

# plot  
grid.newpage()
grid.draw(v)

哪个产生

显然,这种方法会因更多类别和交叉点而迅速失控。

【讨论】:

  • 有人对如何以编程方式完成此操作有任何反馈吗?我一直在生成 venn.diagrams 并试图破译标签顺序和类别标签之间的关系,即上例中的“foo”和“baa”。这样我至少可以根据身份进行匹配。
  • 对于 3 路维恩来说,这对我有用。它是来自 Stack 的几个人代码的混合物,很抱歉没有参考。事情是标签 start 在列表中的位置 7 处为 Venn's 的 3 个圆圈,因此是 i+6grid.draw(ven.plot) overlaps &lt;- calculate.overlap(named.list.for.venn) overlaps &lt;- overlaps[ sort(names(overlaps)) ] for (i in 1:length(overlaps)){ lab &lt;- paste0("a", i) ven.plot[[i+6]]$label &lt;- paste(overlaps[[i]], collapse = "\n") } grid.newpage() grid.draw(ven.plot)
  • 斯科特。请随意编辑答案以将您的方法应用于示例或使用新示例扩展它。或者,当然,您可以添加一个新答案:将其隐藏在 cmets 中。
  • @Will;重新交集标签;不是通过编辑情节,因为没有相关的 grob。但是您可以手动添加另一个文本 grob,例如grid.text("foo_bar", x=0.5, y=0.8) -- 您可以通过编程方式尝试查找 xy
  • @Will;重新圆大小;看看?venn.diagram 的选项;快速浏览表明area.vector 可能是相关的。虽然也许仅仅减小绘图设备的尺寸就足够了,以获得更小的绘图从而更小的圆圈。
【解决方案2】:

使用RAM 包:

library(RAM)
foo <- c('a','b','c','d')
baa <- c('a','e','f','g')
group.venn(list(foo=foo, baa=baa), label=TRUE, 
    fill = c("orange", "blue"),
    cat.pos = c(0, 0),
    lab.cex=1.1)

【讨论】:

  • @A_Skelton73 ;现在可能值得打勾
  • 只支持2组有实际物品标签
  • 标签可以分成多列吗?
  • @eod 一个非常简单(原始)的解决方案是group.venn(list("Row1\nRow2"=foo, "baa"=baa), label=TRUE, fill = c("orange", "blue"), cat.pos = c(0, 0), lab.cex=1.1)
  • 嗯,我应用了你的版本,但它不相交。两个圈子变得独立。
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多