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()
.
:::shapes
ggVennDiagram#> # A tibble: 104 × 6
#> nsets type shape_id component id xy
#> <dbl> <chr> <chr> <chr> <chr> <list>
#> 1 4 ellipse 401f setEdge 1 <dbl [101 × 2]>
#> 2 4 ellipse 401f setEdge 2 <dbl [101 × 2]>
#> 3 4 ellipse 401f setEdge 3 <dbl [101 × 2]>
#> 4 4 ellipse 401f setEdge 4 <dbl [101 × 2]>
#> 5 4 ellipse 401f setLabel 1 <dbl [1 × 2]>
#> 6 4 ellipse 401f setLabel 2 <dbl [1 × 2]>
#> 7 4 ellipse 401f setLabel 3 <dbl [1 × 2]>
#> 8 4 ellipse 401f setLabel 4 <dbl [1 × 2]>
#> 9 1 polygon 101 setEdge 1 <dbl [194 × 2]>
#> 10 2 polygon 201 setEdge 1 <dbl [194 × 2]>
#> # … with 94 more rows
#> # ℹ Use `print(n = ...)` to see more rows
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.
<- paste0("gene",1:1000)
genes set.seed(20210701)
<- list(A = sample(genes,100),
gene_list B = sample(genes,200),
C = sample(genes,300),
D = sample(genes,200))
# construct a Venn object
= Venn(gene_list)
venn = process_data(venn, shape_id == "401")
data
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.
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
<- list(c(-69277,-32868,135580,121186, 70900,199427),
vertex_coordinates 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))
<- lapply(vertex_coordinates, triangle) triangles
Likewise, label_position()
is used to setup the
coordinates of set labels.
<- tibble::tribble(
position ~x, ~y,
-50000, 50000,
60000, 0,
160000, 20000,
280000, 170000,
140000, 300000,
-20000, 270000
)= label_position(position) label_position
Then construct a VennPlotData
class object with shapes
and labels.
= VennPlotData(setEdge = triangles,
shape setLabel = label_position)
Now we can join plot data with set and calculated region values with
plotData_add_venn()
.
<- paste0("gene",1:1000)
genes set.seed(20210701)
<- list(A = sample(genes,100),
x B = sample(genes,150),
C = sample(genes,200),
D = sample(genes,250),
E = sample(genes,300),
F = sample(genes,350))
= Venn(x)
venn
= plotData_add_venn(plotData = shape, venn = venn) data
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")