knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(ggVennDiagram)
The ggVennDiagram package has a set of built-in shapes that are used to plot
Venn diagram. These internal data are stored as sys data as a tibble. It can be
viewed with ggVennDiagram:::shapes
and plotted with the function plot_shapes()
.
ggVennDiagram:::shapes library(ggplot2)
The format of these shapes data are defined as followings:
a tibble with 6 columns
nsets
: number of sets, from 1-7.
type
: ellipse, circle or triangle
shape_id
: to separate different shapes
component
: each shape has two components, 'setEdge' and 'setLabel'
id
: to separate edges/labels of a shape. For example, 4 sets shape will have ids of 1-4.
xy
: coordinates
plot_shapes()
By default, only the most appropriate shape is used when calling the main function
ggVennDiagram()
. However, it may be specified in step wise plot which has been
described in fully customed plot.
For example:
# Generate example data. genes <- paste0("gene",1:1000) set.seed(20210701) gene_list <- list(A = sample(genes,100), B = sample(genes,200), C = sample(genes,300), D = sample(genes,200)) # construct a Venn object venn = Venn(gene_list) data = process_data(venn, shape_id == "401") ggplot() + geom_sf(aes(fill = count), data = venn_region(data)) + geom_sf(aes(color = id), data = venn_setedge(data), show.legend = FALSE) + geom_sf_text(aes(label = name), data = venn_setlabel(data)) + geom_sf_label(aes(label = count), data = venn_region(data)) + theme_void()
Besides, user can use a novel shape when knows its coordinates. A possible start is from a SVG shape. Therefore, I would like to show the method of using a novel triangle shape to plot 6-sets Venn diagram in this section.
The triangle is found in WiKi at https://upload.wikimedia.org/wikipedia/commons/5/56/6-set_Venn_diagram_SMIL.svg.
# I have to use a copy here svg_url = "https://vnote-1251564393.cos.ap-chengdu.myqcloud.com/typora-img/triangles.svg" knitr::include_graphics(svg_url)
Since SVG is a XML format file, the coordinates can be found in its content.
For this figure, the definition of six triangles are stored in the six object,
object1b
, object2b
, ..., object6b
. We just need to build set regions by
closing the vertexes with the function triangle()
.
# the vertext coordinates of six triangles vertex_coordinates <- list(c(-69277,-32868,135580,121186, 70900,199427), c( 81988,-44426, 38444,206222,121044,165111), c(203271, 9619, 39604, 82683, 84652,206669), c(333561,225349, 61764, 76805, 38980,182461), c(131886,385785, 38136,111491, 94208, 24690), c(-60184,274046,142476, 39903,103276,183962)) triangles <- lapply(vertex_coordinates, triangle)
Likewise, label_position()
is used to setup the coordinates of set labels.
position <- tibble::tribble( ~x, ~y, -50000, 50000, 60000, 0, 160000, 20000, 280000, 170000, 140000, 300000, -20000, 270000 ) label_position = label_position(position)
Then construct a VennPlotData
class object with shapes and labels.
shape = VennPlotData(setEdge = triangles, setLabel = label_position)
Now we can join plot data with set and calculated region values with plotData_add_venn()
.
genes <- paste0("gene",1:1000) set.seed(20210701) x <- list(A = sample(genes,100), B = sample(genes,150), C = sample(genes,200), D = sample(genes,250), E = sample(genes,300), F = sample(genes,350)) venn = Venn(x) data = plotData_add_venn(plotData = shape, venn = venn)
and plot Venn diagram with ggplot2.
ggplot() + geom_sf(aes(fill = count), data = venn_region(data)) + geom_sf(aes(color = name), size = 2, data = venn_setedge(data)) + geom_sf_text(aes(label = name), data = venn_setlabel(data)) + theme_void() + labs(color = "Set Name", fill = "Count")
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.