---
title: "Fully Customed Venn Diagram"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Fully Customed Venn Diagram}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

```{r setup}
library(ggVennDiagram)
```

## Comprehensive customization by using helper functions

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.

```{r}
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))
```


```{r}
library(ggVennDiagram)
library(ggplot2)
```

Then we can reproduce the plot of `ggVennDiagram()` with several lines.

```{r}
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.

```{r}
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 object
- `venn_regionedge()`: get region edge data to plot
- `venn_regionlabel()`: get region label position to plot
- `venn_setedge()`: get setedge data to plot
- `venn_setlabel()`: get setlabel data to plot


For example, you may change edge/fill/label properties as you will.

```{r}
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()
```

## Access to classes

```{r}
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
```

### Access to subset items

To view subset itmes interactively, set `show_intersect = TRUE`.

```{r}
ggVennDiagram(y, show_intersect = TRUE, set_color = "black")
```


```{r}
venn_y = Venn(y)

venn_y
```



```{r}
# 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
```


### Access to plot data

```{r}
venn_plot_data = process_data(venn_y)

# summary of VennPlotData object
venn_plot_data
```

Sets and labels

```{r}
# get the set data
venn_set(venn_plot_data)

# get subsets, i.e., regions
venn_region(venn_plot_data)
```

Polygons.

```{r}
# get set edge
venn_setedge(venn_plot_data)

# get region edge
venn_regionedge(venn_plot_data)
```

```{r}
df = venn_setedge(venn_plot_data)
plot(df$X, df$Y, asp = 1)
```