维恩图的比例和颜色阴影,带有半透明效果。

61

我有以下类型的计数数据。

A   450
B   1800
A and B both    230

我想开发一个像下面这个 Venn 图表一样有色彩(可能在交叉点处半透明)的东西。

输入图片描述

注意:这张图是用 PowerPoint 手绘的样例,并不按比例缩放。


为什么不从 library("sos"); findFn("venn") 开始,看看能走多远? - Ben Bolker
或者使用 venneuler 包,它可以实现这个功能。 - Simon Urbanek
7个回答

56

这篇文章讨论了如何从集群列表和共现因素生成维恩图

要轻松解决问题,请使用软件包venneuler

require(venneuler)
v <- venneuler(c(A=450, B=1800, "A&B"=230))
plot(v)

enter image description here

若需更高级和定制化的解决方案,请查看包VennDiagram

library(VennDiagram) 
venn.diagram(list(B = 1:1800, A = 1571:2020), fill = c("lightblue", "green"), 
             alpha = c(0.5, 0.5), lwd =0, "venn_diagram.tiff")

这里输入图片描述


3
这个软件包是否对数据采用任何逻辑?我输入了这个:v <- venneuler(c(A=100, B=100, "A&B"=50, C=100, "A&C"=25)),它生成了一个图表,其中包括B和C之间的一个小交集。 - SabreWolfy
@SabreWolfy:是的,很有趣,不过我不确定啊。你可能需要调整一些venneuler参数来消除这种奇怪的重叠... - Geek On Acid
6
尝试运行 v <- venneuler(c(A=450, B=1800, "A&B"=425)),然后运行 plot(v) 并注意重叠部分与正确结果相差甚远。'A' 的几乎全部应被'B' 覆盖。我对这个包非常持怀疑态度。 - DunderChief
@DunderChief 我也遇到了这个软件包似乎存在严重的不准确性问题。我给维护者发了电子邮件,但从未收到回复。 - Gregor Thomas
4
关于venneuler,你可能会感兴趣这个链接:http://benfred.github.io/venn.js/tests/venneuler_comparison/。 - Johan Larsson
显示剩余3条评论

53

我最近发布了一个新的R软件包,eulerr,它可以满足你的需求。它与venneuler相似,但没有其不一致之处。

library(eulerr)
fit <- euler(c(A = 450, B = 1800, "A&B" = 230))
plot(fit)

eulerplot

或者您可以尝试使用同一R包的闪亮应用程序,位于eulerr.co

shiny-euler


4
这个动画化的闪亮应用程序让我决定了。 - Megatron
1
优秀的包。在我看来,小缺陷是默认的颜色方案,使用白色作为第一组和背景,因此缺乏对比度。 另外,提供的代码片段在最近的 R/包版本下没有给出相同的结果。 - Holger Brandl
我对默认的“数量”标签感到惊讶/困惑。我原以为每个计数标签会显示该区域的数量而不是总数,这样如果您将所有显示的数字加起来,就可以得到总数N。在您的示例中,A是5,但仅A是3。A&B是2,但A&B而非C是1.5。B是3,但仅B是1。在这方面,区域面积似乎也与其数量不成比例。 - Brian D
@BrianD,有时候并不总是完美匹配,因此有时候这些区域实际上并不完全成比例。如果你把所有的区域加起来,你会得到总数N。这是因为我选择了“不相交组合”而不是输入的联合。 - Johan Larsson
上面的venneuler包需要Java,但这个不需要,所以这特别好。 - a-h
显示剩余3条评论

43

基于Geek On Acid的第二个答案的第二个建议(再次感谢),我也能够解决线路问题。我发布这个,以便其他谷歌搜索者可以受益!

  require(VennDiagram)
    venn.diagram(list(B = 1:1800, A = 1571:2020),fill = c("red", "green"),
  alpha = c(0.5, 0.5), cex = 2,cat.fontface = 4,lty =2, fontfamily =3, 
   filename = "trial2.emf");

这里输入图片描述


嗨,我正在使用 vennDiagram(sub, cex=..,lwd=2,circle.col=...),但当我尝试按照您所提到的使用 fill 时,它会提示:1:“fill”不是图形参数。 这是 vennDiagram 版本的问题吗?在这种情况下,您知道正确的“fill”是什么吗?非常感谢。 - PGreen
@PGreen 我刚在 R 2.15.2 中尝试了最新版本的 vennDiagram,对我有效.... - jon
3
我猜问题出在你使用了limma包中的vennDiagram函数,而Jon使用的是vennDiagram包里的venn.diagram函数。vennDiagram函数没有fill参数,这就是为什么会报错的原因。我建议你也使用venn.diagram函数。 - sage88
是否可以将 venn.diagram 打印到默认的 R 图形设备上,而不是导出为 tiff(用于 rmarkdown 文档)? - mindlessgreen
4
要在R图形设备上绘制,请执行vennPlot = venn.diagram(...,filename=NULL); grid.newpage(); grid.draw(vennPlot) - Holger Brandl

17

尽管这不完全回答了你的问题,但我认为这对于其他想绘制维恩图的人会有用。

可以使用gplots包中的venn()函数:

http://www.inside-r.org/packages/cran/gplots/docs/venn
## modified slightly from the example given in the documentation
## Example using a list of item names belonging to the
## specified group.
##
require(gplots) 
## construct some fake gene names..
oneName <- function() paste(sample(LETTERS,5,replace=TRUE),collapse="")
geneNames <- replicate(1000, oneName())

## 
GroupA <- sample(geneNames, 400, replace=FALSE)
GroupB <- sample(geneNames, 750, replace=FALSE)
GroupC <- sample(geneNames, 250, replace=FALSE)
GroupD <- sample(geneNames, 300, replace=FALSE)

venn(list(GrpA=GroupA,GrpB=GroupB,GrpC=GroupC,GrpD=GroupD))

输入图像描述 然后我使用illustrator添加颜色和透明度。 输入图像描述


1
你好!您介意详细说明一下使用Illustrator的含义吗?您是指Adobe Illustrator,还是有一种只使用R就能实现上面那个图表的方法? - Manuel Reis
2
抱歉,我的错!我是指使用Adobe Illustrator。 - ktyagi

5

我知道提问者想要R语言的解决方案,但是我想指出一个基于Web的解决方案,叫做BioVenn。它可以处理3个元素列表,并绘制一个维恩图,使每个表面的大小与元素数量成比例 - 就像这个:

enter image description here

在这个图表中,我手动更改了数字的位置(通过 PhotoShop),因为我不喜欢 BioVenn 选择的位置。但是您可以选择不使用数字。
理论上,与 BioVenn 一起使用的列表应该由基因 ID 组成,但实际上并不重要 - 列表只需要包含字符串即可。

2
在这个图示中,我通过PhotoShop手动更改了数字的位置,因为我不喜欢BioVenn选择的位置。但是你可以选择不显示数字。实际上,在BioVenn中,你可以直接拖放数字到任何位置,无需使用PhotoShop :-) - Tim Hulsen

5

0

顺便说一下:我找到了一个用于Python的this包,可以做同样的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接