我有一个输入文件,其中包含~50000个簇的列表,并且每个簇中都存在多个因子(总共约1000万个条目),请参阅下面的较小示例:
set.seed(1)
x = paste("cluster-",sample(c(1:100),500,replace=TRUE),sep="")
y = c(
paste("factor-",sample(c(letters[1:3]),300, replace=TRUE),sep=""),
paste("factor-",sample(c(letters[1]),100, replace=TRUE),sep=""),
paste("factor-",sample(c(letters[2]),50, replace=TRUE),sep=""),
paste("factor-",sample(c(letters[3]),50, replace=TRUE),sep="")
)
data = data.frame(cluster=x,factor=y)
Run Code Online (Sandbox Code Playgroud)
在另一个问题的帮助下,我得到了一个像这样的因素同时出现的饼图:
counts = with(data, table(tapply(factor, cluster, function(x) paste(as.character(sort(unique(x))), collapse='+'))))
pie(counts[counts>1])
Run Code Online (Sandbox Code Playgroud)
但是现在我想得到一个因子共存的维恩图.理想情况下,也可以采用每个因子的最小计数阈值.例如,针对不同因素的维恩图,使得每个因子中的每一个必须在每个群集中存在n> 10以被考虑.
我试图找到一种方法来生成具有聚合的表计数,但无法使其工作.
我找到了实现这一目标的方法,但它需要大量的猜测,并且所有的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)
Run Code Online (Sandbox Code Playgroud)
plot(z$x,z$y,type='n')
text(z$x,z$y,z$name)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
因此,这是一个非常繁琐的过程,为每个项目提供x和y坐标,然后猜测放置圆圈的位置以及给出它们的半径.
理想情况下,我想使用我最初的数据集,如下所示:
cat1=c('itm2','itm3','itm0')
cat2=c('itm1','itm4','itm5','itm6')
cat3=c('itm6','itm7','itm8','itm9')
Run Code Online (Sandbox Code Playgroud)
然后将点分配到正确的圆圈中.有没有更好的方法呢?