有没有办法制作包含所有点的维恩图?

时间:2017-06-07 01:35:05

标签: r venn-diagram

我想出了一种方法来实现这一点,但它需要大量的猜测,并且所有的Venn或Euler图表包似乎只允许您将总出现次数放在圆圈内。

数据:

name=c('itm1','itm2','itm3','itm4','itm5','itm6','itm7','itm8','itm9','itm0')
x=c(5,2,3,5,6,7,7,8,9,2)
y=c(6,9,9,7,6,5,2,3,2,4)
z=data.frame(name,x,y)

绘制点并标记它们:

plot(z$x,z$y,type='n')
text(z$x,z$y,z$name)

enter image description here

手动将圆圈放在点上:

par(new=T)
symbols(3,7,circles=2.5,add=T,bg='#34692499',inches=F)
symbols(6,6,circles=1.5,add=T,bg='#64392499',inches=F)
symbols(8,3,circles=2,add=T,bg='#24399499',inches=F)

enter image description here

因此,这是一个非常繁琐的过程,为每个项目提供x和y坐标,然后猜测放置圆圈的位置以及给出它们的半径。

理想情况下,我想使用我最初拥有的数据集,如下所示:

cat1=c('itm2','itm3','itm0')
cat2=c('itm1','itm4','itm5','itm6')
cat3=c('itm6','itm7','itm8','itm9')

然后只需将点分配到右侧圆圈即可。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

我的感觉,基于线程讨论是建议使用UnSetR R包?

好的,为什么?

我个人的感觉是,如果我们有超过五或七组,维恩图方法就会崩溃。有关此背景下可用的各种选项的概述,我建议您查看:

我认为另一个有用的网站是:

他们一起对可用选项进行了很好的报道。

因此,我的感觉是,如果集合的数量超过一个平凡的阈值,这里的核心挑战是集合交叉点数量的组合爆炸。那怎么解决?

提议的解决方案UnSet

嗯,UnSet专注于创建数据关系的任务驱动的聚合视图,它传达聚合和交叉的大小和属性。对我来说至少这似乎是一种更好的方式 - 这是一个建议。

这至少是一种替代方法 - 我希望它有所帮助。

取消设置参考资料:

UnSetR Vignettes

目前有四个小插图解释了如何使用UpSetR包中包含的功能:

取消设置电影数据集示例1

if (!require(UpSetR)) install.packages("UpSetR")

movies <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), 
                   header = T, sep = ";")

upset(movies, nsets = 6, number.angles = 30, point.size = 3.5, line.size = 2, 
      mainbar.y.label = "Genre Intersections", sets.x.label = "Movies Per Genre", 
      text.scale = c(1.3, 1.3, 1, 1, 2, 0.75))

enter image description here

取消设置电影数据集示例2

upset(movies, sets = c("Action", "Adventure", "Comedy", "Drama", "Mystery", 
                       "Thriller", "Romance", "War", "Western"), mb.ratio = c(0.55, 0.45), order.by = "freq")

enter image description here

答案 1 :(得分:0)

如果您不介意手动执行此操作,则可以使用locator来加快处理速度:

points <- locator(2)
# click first at the circle centre, then somewhere on the circle edge
symbols(points$x[1], points$y[1], 
  circles = sqrt(sum(points$x - points$y)^2), 
  add = TRUE, bg = alpha('orange', .2), inches = F)