Graph drawing with netplot

Some features:

  1. Auto-scaling of vertices using sizes relative to the plotting device.
  2. Embedded edge color mixer.
  3. True curved edges drawing.
  4. User-defined edge curvature.
  5. Nicer vertex frame color.
  6. Better use of space filling the plotting device.
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

Introduction

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, main="netplot")
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)

Multiple plots

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
)

Nodes

gridExtra::grid.arrange(
  nplot(UKfaculty, layout = l_ukf, vertex.size.range = c(.025, .025)),
  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)

Edges

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
)

Node labels

data(UKfaculty, package = "igraphdata")
# fakenames <- sample


Try the netplot package in your browser

Any scripts or data that you put into this service are public.

netplot documentation built on June 16, 2021, 9:09 a.m.