--- title: "Multi-Group, Multi-Cluster, and Multilevel Networks" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Multi-Group, Multi-Cluster, and Multilevel Networks} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, fig.width = 7, fig.height = 5, out.width = "100%", background = "white", fig.bg = "white", dev = "jpeg", dpi = 100, comment = "#>" ) suppressPackageStartupMessages({ library("cograph") }) old_opts <- options() options(scipen = 99, digits = 2, max.print = 30, width = 83) old_par <- par(no.readonly = TRUE) par(mar = c(0,0,0,0)) ``` `cograph` provides three functions for visualizing networks with grouped structure: `plot_htna()` for multi-group layouts, `plot_mtna()` for multi-cluster layouts with summary edges, and `plot_mlna()` for multilevel networks rendered in 3D perspective. All three accept a weight matrix and a list defining how nodes are assigned to groups, clusters, or layers. ```{r} library(cograph) ``` # Setup We use a 15-node weight matrix with three groups throughout this vignette. ```{r} set.seed(42) nodes <- paste0("N", 1:15) m <- matrix(runif(225, 0, 0.3), 15, 15) diag(m) <- 0 colnames(m) <- rownames(m) <- nodes groups <- list( Teacher = paste0("N", 1:5), Student = paste0("N", 6:10), System = paste0("N", 11:15) ) ``` # plot_htna: Multi-Group Networks `plot_htna()` arranges groups of nodes into geometric patterns. For two groups it produces a bipartite layout; for three or more it arranges groups along the edges of a polygon or along arcs of a circle. ## Example 1: Polygon layout With three groups, the default layout places each group along one edge of a triangle. ```{r} par(mar = c(0, 0, 0, 0)) plot_htna(m, groups, layout = "polygon", minimum = 0.15, esize = 3) ``` ## Example 2: Circular layout The circular layout places groups along arcs of a circle instead of polygon edges. ```{r} par(mar = c(0, 0, 0, 0)) plot_htna(m, groups, layout = "circular", minimum = 0.15, esize = 3) ``` ## Example 3: Custom colors and shapes ```{r} plot_htna(m, groups, layout = "polygon", minimum = 0.15, esize = 3, group_colors = c("#E63946", "#457B9D", "#2A9D8F"), group_shapes = c("circle", "square", "diamond")) ``` ## Example 4: Two-group bipartite With two groups, `plot_htna()` produces a bipartite layout by default. Jitter spreads nodes horizontally based on their cross-group connectivity. ```{r} two_groups <- list( Teacher = paste0("N", 1:7), Student = paste0("N", 8:15) ) plot_htna(m, two_groups, minimum = 0.15, esize = 3) ``` ## Example 5: Horizontal bipartite ```{r, fig.height = 4} plot_htna(m, two_groups, minimum = 0.15, esize = 3, orientation = "horizontal") ``` ## Example 6: Four groups With four groups the polygon layout produces a rectangle. ```{r} four_groups <- list( Input = paste0("N", 1:4), Process = paste0("N", 5:8), Output = paste0("N", 9:12), Storage = paste0("N", 13:15) ) plot_htna(m, four_groups, layout = "polygon", minimum = 0.15, esize = 3) ``` # plot_mtna: Multi-Cluster Networks `plot_mtna()` places each cluster inside a bordered shape and draws aggregated summary edges between clusters. Individual within-cluster edges are shown inside each shape. The alias `mtna()` is available as shorthand. ## Example 7: Default cluster layout ```{r, fig.width = 8, fig.height = 8} set.seed(42) nodes30 <- paste0("N", 1:30) m30 <- matrix(runif(900, 0, 0.3), 30, 30) diag(m30) <- 0 colnames(m30) <- rownames(m30) <- nodes30 clusters <- list( Alpha = paste0("N", 1:5), Beta = paste0("N", 6:10), Gamma = paste0("N", 11:15), Delta = paste0("N", 16:20), Epsilon = paste0("N", 21:25), Zeta = paste0("N", 26:30) ) plot_mtna(m30, clusters, minimum = 0.1) ``` ## Example 8: Custom shapes and spacing ```{r, fig.width = 8, fig.height = 8} plot_mtna(m30, clusters, minimum = 0.1, shapes = c("circle", "square", "diamond", "triangle", "circle", "square"), spacing = 4, shape_size = 1.5) ``` ## Example 9: Grid layout ```{r, fig.width = 8, fig.height = 8} plot_mtna(m30, clusters, layout = "grid", spacing = 4, minimum = 0.1) ``` ## Example 10: Three clusters ```{r} three_clusters <- list( Alpha = paste0("N", 1:5), Beta = paste0("N", 6:10), Gamma = paste0("N", 11:15) ) plot_mtna(m, three_clusters, minimum = 0.1) ``` # plot_mlna: Multilevel Networks `plot_mlna()` renders layers stacked in 3D perspective. Within-layer edges are drawn as solid lines and between-layer edges as dashed lines connecting adjacent layers. The alias `mlna()` is available as shorthand. ## Example 11: Default multilevel ```{r, fig.width = 8, fig.height = 10} set.seed(42) nodes21 <- paste0("N", 1:21) m21 <- matrix(runif(441, 0, 0.3), 21, 21) diag(m21) <- 0 colnames(m21) <- rownames(m21) <- nodes21 layers <- list( Macro = paste0("N", 1:7), Meso = paste0("N", 8:14), Micro = paste0("N", 15:21) ) plot_mlna(m21, layers, minimum = 0.2, legend = FALSE) ``` ## Example 12: Spring layout The spring layout uses a force-directed algorithm within each layer. ```{r, fig.width = 8, fig.height = 10} plot_mlna(m21, layers, layout = "spring", minimum = 0.2, legend = FALSE) ``` ## Example 13: Circle layout ```{r, fig.width = 8, fig.height = 10} plot_mlna(m21, layers, layout = "circle", minimum = 0.2, legend = FALSE) ``` ## Example 14: Custom colors and perspective ```{r, fig.width = 8, fig.height = 10} plot_mlna(m21, layers, minimum = 0.2, colors = c("#E63946", "#457B9D", "#2A9D8F"), skew_angle = 35, layer_spacing = 2.5, legend = FALSE) ``` ## Example 15: Without between-layer edges ```{r, fig.width = 8, fig.height = 10} plot_mlna(m21, layers, minimum = 0.2, between_edges = FALSE, legend = FALSE) ``` # Parameter reference ## plot_htna | Parameter | Description | Default | |-----------|-------------|---------| | `x` | Weight matrix or tna object | Required | | `node_list` | List of character vectors defining groups | Required | | `layout` | `"auto"`, `"bipartite"`, `"polygon"`, `"circular"` | `"auto"` | | `orientation` | `"vertical"` or `"horizontal"` (bipartite only) | `"vertical"` | | `jitter` | Controls horizontal spread of nodes | `TRUE` | | `jitter_amount` | Base jitter amount (0-1) | `0.8` | | `curvature` | Edge curvature | `0.4` | | `group_colors` | Color per group | Auto | | `group_shapes` | Shape per group | Auto | | `minimum` | Min weight to display | `0` | | `legend` | Show legend | `TRUE` | ## plot_mtna | Parameter | Description | Default | |-----------|-------------|---------| | `x` | Weight matrix or tna object | Required | | `cluster_list` | List of character vectors defining clusters | Required | | `layout` | `"circle"`, `"grid"`, `"horizontal"`, `"vertical"` | `"circle"` | | `spacing` | Distance between cluster centers | `3` | | `shape_size` | Cluster shell size | `1.2` | | `node_spacing` | Node placement within shapes (0-1) | `0.5` | | `shapes` | Shape per cluster | Auto | | `colors` | Color per cluster | Auto | | `summary_edges` | Show aggregated between-cluster edges | `TRUE` | | `within_edges` | Show within-cluster edges | `TRUE` | | `node_size` | Node size | `2` | ## plot_mlna | Parameter | Description | Default | |-----------|-------------|---------| | `model` | Weight matrix or tna object | Required | | `layer_list` | List of character vectors defining layers | Required | | `layout` | `"horizontal"`, `"circle"`, `"spring"` | `"horizontal"` | | `layer_spacing` | Vertical distance between layers | `2.2` | | `layer_width` | Width of each layer | `4.5` | | `layer_depth` | Depth for 3D effect | `2.2` | | `skew_angle` | Perspective skew in degrees | `25` | | `within_edges` | Show within-layer edges | `TRUE` | | `between_edges` | Show between-layer edges | `TRUE` | | `between_style` | Line style for between edges (1-3) | `2` | | `minimum` | Min weight to display | `0` | | `node_size` | Node size | `3` | ```{r, include = FALSE} options(old_opts) par(old_par) ```