Would something like this be a start?
This shows which terms show up in which sets. Intersections on specific terms are given by dots at the same $x$ position.
The ordering may be helpful... or it may be misleading. You will have to consider your specific application.
Of course, the problem is that we can't distinguish the sets (the $y$ axis labels) any more. I suspect that this will always be hard with 90 groups. Possibilities may be:
- Limiting the plot to "important" groups (defined according to your specific application)
- Grouping sets into groups of horizontal dots
- Working with colors if sets can be grouped meaningfully
- Only putting every second set name on the left side, and the others on the right
The same problem will occur if you have more than 20 terms overall. Similar remedies may be possible.
terms <- sprintf("%07i",round(100000*runif(20),0))
sets <- sapply(1:90,FUN=function(y)sample(x=terms,size=rpois(1,2)+1))
names(sets) <- paste("A",1:length(sets),sep="")
tab <- t(sapply(sets,function(xx)table(factor(xx,levels=terms))))
tab <- tab[,order(colSums(tab),decreasing=TRUE)]
tab <- tab[rev(do.call(order,as.data.frame(tab))),]
for ( ii in 1:nrow(tab) ) points(which(tab[ii,]==1),rep(nrow(tab)-ii+1,sum(tab[ii,])),pch=19)