Some features:
knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(netplot) library(igraph) library(sna) library(ggraph) # We will use the UKfaculty data from the igraphdata package data("UKfaculty", package = "igraphdata") # With a fixed layout set.seed(225) l_ukf <- layout_with_fr(UKfaculty)
Since igraph and statnet do the plotting using base system graphics, we can't put everything in the same device right away. Fortunately, the gridGraphics R package allows us to reproduce base graphics using the grid system, which, in combination with the function gridExtra::grid.arrange will let us put both base and grid graphics in the same page. First me write a func
# Function to map base to grid map_base_to_grid <- function(fun) { gridGraphics::grid.echo(fun) grid::grid.grab() }
# Mapping base to grid ig <- map_base_to_grid(function() plot(UKfaculty, main = "igraph")) nw <- map_base_to_grid(function() gplot(as.matrix(as_adj(UKfaculty)), coord = l_ukf, main = "sna"))
nplot(UKfaculty, layout = l_ukf) grid::grid.text("netplot", x = .05, y=.9) np <- grid::grid.grab()
Here is an example with ggraph
ggraph::ggraph(UKfaculty, layout = l_ukf) + ggraph::geom_edge_arc() + ggraph::geom_node_point() + ggplot2::ggtitle("ggraph") gg <- grid::grid.grab()
# Putting all together gridExtra::grid.arrange(ig, nw, gg, np, nrow=2, ncol=2)
To arrange multiple plots in the same page we can use the grid.arrange function from the gridExtra package
x_igraph <- sample_smallworld(1, 20, 4, .05) x_network <- intergraph::asNetwork(x_igraph) l <- layout_nicely(x_igraph) # Putting two plots in the same page (one using igraph and the other network) gridExtra::grid.arrange( nplot(x_igraph, layout = l), nplot(x_network, layout = l), ncol=2, nrow=1 )
gridExtra::grid.arrange( nplot(UKfaculty, layout = l_ukf, vertex.size = rep(.025, vcount(UKfaculty)), vertex.size.range = NULL), nplot(UKfaculty, layout = l_ukf, vertex.size.range = c(.01, .025)), nplot(UKfaculty, layout = l_ukf, vertex.size.range = c(.01, .025, 4)), nplot(UKfaculty, layout = l_ukf, vertex.size.range = c(.02, .05, 4)), ncol=2, nrow=2 )
nplot(make_ring(5), vertex.nsides = 2:6, vertex.size.range = c(.1,.1), edge.curvature = 0)
set.seed(12233) x <- sample_smallworld(1, size = 10, nei = 2, .1) l <- layout_with_fr(x)
gridExtra::grid.arrange( nplot( x, layout = l, edge.color = ~ego(mix=0, alpha = .1, col="black") + alter(mix=1), vertex.size.range = c(.05,.1) ), nplot( x, layout = l, edge.color = ~ego(mix=.5, alpha = .1, col="black") + alter(mix=.5), vertex.size.range = c(.05,.1) ), nplot( x, layout = l, edge.color = ~ego(mix=1, alpha = .1, col="black") + alter(mix=0), vertex.size.range = c(.05,.1) ), ncol=3, nrow=1 )
gridExtra::grid.arrange( nplot(x, layout = l, edge.curvature = 0, vertex.size.range = c(.05,.1)), nplot(x, layout = l, edge.curvature = pi/2, vertex.size.range = c(.05,.1)), nplot(x, layout = l, edge.curvature = pi, vertex.size.range = c(.05,.1)), ncol = 3, nrow=1 )
gridExtra::grid.arrange( nplot(x, layout = l, edge.line.breaks=3), nplot(x, layout = l, edge.line.lty = 2, edge.line.breaks=10), nplot(x, layout = l, edge.line.lty = 3, edge.line.breaks=10), nplot(x, layout = l, edge.line.lty = 4, edge.line.breaks=10), nrow=2, ncol=2 )
The edge.width parameter controls the relative width of each edge. Values are
normalized and mapped to the range [min, max] specified by edge.width.range
(in points). For nplot.igraph, this defaults to the "weight" edge attribute
when present. Use edge.width.range = NULL to keep supplied widths unchanged.
set.seed(1) x_w <- make_ring(8) # Assign varying edge weights E(x_w)$weight <- c(1, 3, 1, 5, 2, 4, 1, 6) l_w <- layout_in_circle(x_w)
gridExtra::grid.arrange( nplot(x_w, layout = l_w, skip.arrows = TRUE, vertex.size.range = c(.05, .05), edge.width = 1, edge.width.range = c(1, 2)), nplot(x_w, layout = l_w, skip.arrows = TRUE, vertex.size.range = c(.05, .05), edge.width = E(x_w)$weight, edge.width.range = c(1, 2)), nplot(x_w, layout = l_w, skip.arrows = TRUE, vertex.size.range = c(.05, .05), edge.width = E(x_w)$weight, edge.width.range = NULL), ncol = 3, nrow = 1 )
You can also modify edge widths after the plot has been created using
set_edge_gpar():
g <- nplot(x_w, layout = l_w, skip.arrows = TRUE, vertex.size.range = c(.05, .05)) gridExtra::grid.arrange( set_edge_gpar(g, element = "line", lwd = 1), set_edge_gpar(g, element = "line", lwd = 4), ncol = 2 )
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.