Suppose I have two vectors
foo <- c('a','b','c','d')
baa <- c('a','e','f','g')
Does anyone know of a way to produce a venn diagram but have the vector items visualised within the diagram.
Like so? (made in powerpoint)
A quick solution using the venn.diagram
function from the VennDiagram
package. The labels (counts) are hard coded in the function so can't be changed using function arguments. But for a simple example like this you can change the grobs
yourself.
library(VennDiagram)
# your data
foo <- c('a','b','c','d')
baa <- c('a','e','f','g')
# Generate plot
v <- venn.diagram(list(foo=foo, baa=baa),
fill = c("orange", "blue"),
alpha = c(0.5, 0.5), cat.cex = 1.5, cex=1.5,
filename=NULL)
# have a look at the default plot
grid.newpage()
grid.draw(v)
# have a look at the names in the plot object v
lapply(v, names)
# We are interested in the labels
lapply(v, function(i) i$label)
# Over-write labels (5 to 7 chosen by manual check of labels)
# in foo only
v[[5]]$label <- paste(setdiff(foo, baa), collapse="\n")
# in baa only
v[[6]]$label <- paste(setdiff(baa, foo) , collapse="\n")
# intesection
v[[7]]$label <- paste(intersect(foo, baa), collapse="\n")
# plot
grid.newpage()
grid.draw(v)
Which produces
Obviously this method would quickly get out of hand with more categories and intersections.
venn.diagram
from theVennDiagram package
is based ongrid
graphics and the function returns the object. This allows you to go in and manually change the labels to show the items rather than the counts. – user20650