【问题标题】:Is there a way to make a Venn diagram with all the points inside?有没有办法制作一个包含所有点的维恩图?
【发布时间】:2017-06-07 01:35:04
【问题描述】:

我想出了一个方法来完成这个,但它需要大量的猜测,所有的维恩图或欧拉图包似乎只允许你将出现的总数放在圆圈内。

数据:

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)

手动将圆圈放在点上:

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)

所以这是一个非常繁琐的过程,需要给每个项目一个 x 和 y 坐标,然后猜测圆圈的位置和半径。

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

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

然后将点分配到正确的圆圈中。有更好的方法吗?

【问题讨论】:

  • 所以绘制点的 x 和 y 值对您来说无关紧要吗?你是如何确定圆圈大小的?
  • 我只是手动放置它们在情节和来源之间来回移动。 x 和 y 值无关紧要,只要在同一个圆圈中的值聚集在一起即可。在我绘制了这些点之后,我以同样乏味的方式制作了圆圈,查看圆圈是否包含应该在其中的点,如果没有,我相应地更改它的坐标和大小。然后我再次移动了一些点,使它们看起来更好。对于 10 个项目的样本,这不是什么大问题,但我的数据有更多,我相信其他人也有更大的数据集。
  • 放置点时是否要确认重叠区域(=> 项目 6 必须在 cat3 和 cat2 的重叠区域中)?在这种情况下,您可能想要合并 R 的空间包。
  • @lukeA 很抱歉回复晚了,正忙于工作。感谢您将我指向空间方向,但我需要有坐标或将每个项目与一个类别相关联。据我所知,没有空间包或 GIS 允许一个点存在于两个多边形的边界内。但是,您让我以不同的方式想到这一点,我决定使用 igraph 包将项目放置在它们应该在的位置,然后我只需要在它们上面画圆圈或椭圆。不完美,但比我以前的更好。

标签: r venn-diagram


【解决方案1】:

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

好的,为什么?

我个人的感觉是,如果我们有超过 5 或 7 个组,维恩图方法就会失效。有关此上下文中可用的各种选项的概述,我建议您查看:

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

它们一起很好地覆盖了可用的选项。

因此,我的感觉是,如果集合的数量超过一个微不足道的阈值,那么这里的核心挑战是集合交集数量的组合爆炸。那么如何解决呢?


建议解决方案UnSet

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

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

未设置参考资料:

UnSetR 小插曲

目前有四个小插曲解释了如何使用 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))

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

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

【讨论】:

    【解决方案2】:

    如果您不介意手动执行此操作,可以使用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)
    

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2020-08-15
      相关资源
      最近更新 更多