knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(ggVennDiagram)
The main function ggVennDiagram()
accepts a list input, and output a ggplot object.
By measuring the length of input list, it automatically applies internal functions
to build a plot in two steps: data preparation and visualization.
Data preparation was packaged into one function process_data()
. Its output
is a S4 VennPlotData
class object, which contains three slots, setEdge
,
setLabel
and region
. These slot data then can be further plotted with ggplot
functions.
See below for a better understanding.
Generate example data.
genes <- paste0("gene",1:1000) set.seed(20231214) gene_list <- list(A = sample(genes,100), B = sample(genes,200), C = sample(genes,300), D = sample(genes,200))
library(ggVennDiagram) library(ggplot2)
Then we can reproduce the plot of ggVennDiagram()
with several lines.
venn <- Venn(gene_list) data <- process_data(venn) ggplot() + # 1. region count layer geom_polygon(aes(X, Y, fill = count, group = id), data = venn_regionedge(data)) + # 2. set edge layer geom_path(aes(X, Y, color = id, group = id), data = venn_setedge(data), show.legend = FALSE) + # 3. set label layer geom_text(aes(X, Y, label = name), data = venn_setlabel(data)) + # 4. region label layer geom_label(aes(X, Y, label = count), data = venn_regionlabel(data)) + coord_equal() + theme_void()
The variable data
is a structured list that has three slots.
data
ggVennDiagram
export functions to get these data, and they can be used
for comprehensive customization in user-side.
Venn()
: Venn object constructor, use this to construct a Venn object from list.process_data()
: process data with a Venn objectvenn_regionedge()
: get region edge data to plotvenn_regionlabel()
: get region label position to plotvenn_setedge()
: get setedge data to plotvenn_setlabel()
: get setlabel data to plotFor example, you may change edge/fill/label properties as you will.
ggplot() + # change mapping of color filling geom_polygon(aes(X, Y, fill = id, group = id), data = venn_regionedge(data), show.legend = FALSE) + # adjust edge size and color geom_path(aes(X, Y, color = id, group = id), data = venn_setedge(data), linewidth = 3, show.legend = FALSE) + # show set label in bold geom_text(aes(X, Y, label = name), fontface = "bold", data = venn_setlabel(data)) + # add a alternative region name geom_label(aes(X, Y, label = id), data = venn_regionlabel(data), alpha = 0.5) + coord_equal() + theme_void()
set.seed(20231225) y = list( A = sample(letters, 8) |> sort(), B = sample(letters, 8) |> sort(), C = sample(letters, 8) |> sort(), D = sample(letters, 8) |> sort()) # view the list y
To view subset itmes interactively, set show_intersect = TRUE
.
ggVennDiagram(y, show_intersect = TRUE, set_color = "black")
venn_y = Venn(y) venn_y
# find the overlaping members of two or more sets overlap(venn_y, 1:2) # members in both the first two sets overlap(venn_y) # members in all the sets # find the different members between sets and set unions discern(venn_y, 1) # members in set 1, but not in all the resting sets by default discern(venn_y, c("A","B"), 3) # members in set A & B, but not in the third set # find the specific members in one or more sets discern_overlap(venn_y, 1) # specific items in set 1, equals to `discern(venn_y, 1)`. Those members are not shared by all the other sets. discern_overlap(venn_y, 1:2) # specific items in set 1 and set 2
venn_plot_data = process_data(venn_y) # summary of VennPlotData object venn_plot_data
Sets and labels
# get the set data venn_set(venn_plot_data) # get subsets, i.e., regions venn_region(venn_plot_data)
Polygons.
# get set edge venn_setedge(venn_plot_data) # get region edge venn_regionedge(venn_plot_data)
df = venn_setedge(venn_plot_data) plot(df$X, df$Y, asp = 1)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.