multigraph
: Plot and Manipulate Multigraphs in R Antonio Rivero Ostoic (@mplex)
To install multigraph
with the R console, R IDE, or Notebook with R kernel in.
# from CRAN install.packages("multigraph")
or
# from Github devtools::install_github("mplex/multigraph")
When you load the package then multiplex
is automatically invoked.
library("multigraph") # Loading required package: multiplex
Padgett's Florentine Families dataset is publicly available as a Ucinet DL file format. Use function read.dl
of the multiplex
package to retrieve this data.
# read the Padgett Florentine Families dataset as a Ucinet DL file # from a public repository and storage it as an object floflies <- multiplex::read.dl(file = "http://moreno.ss.uci.edu/padgett.dat") # or mirror floflies <- multiplex::read.dl(file = "http://vlado.fmf.uni-lj.si/pub/networks/data/ucinet/padgett.dat") # adjacency matrices floflies , , PADGM ACCIAIUOL ALBIZZI BARBADORI BISCHERI CASTELLAN GINORI GUADAGNI LAMBERTES MEDICI PAZZI PERUZZI PUCCI RIDOLFI SALVIATI STROZZI TORNABUON ACCIAIUOL 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ALBIZZI 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 BARBADORI 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 BISCHERI 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 CASTELLAN 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 GINORI 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 GUADAGNI 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 LAMBERTES 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 MEDICI 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 PAZZI 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 PERUZZI 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 PUCCI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RIDOLFI 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 SALVIATI 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 STROZZI 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 TORNABUON 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 , , PADGB ACCIAIUOL ALBIZZI BARBADORI BISCHERI CASTELLAN GINORI GUADAGNI LAMBERTES MEDICI PAZZI PERUZZI PUCCI RIDOLFI SALVIATI STROZZI TORNABUON ACCIAIUOL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ALBIZZI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 BARBADORI 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 BISCHERI 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 CASTELLAN 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 GINORI 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 GUADAGNI 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 LAMBERTES 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 MEDICI 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 PAZZI 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 PERUZZI 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 PUCCI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RIDOLFI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SALVIATI 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 STROZZI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TORNABUON 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
Object floflies
represents the Florentine families network where "PADGM"
are marriage relations and "PADGB"
correspond to business ties among the 16 actors.
Graph of the Florentine families network using multigraph
function with the default circular layout:
Check also out the vector image of this multigraph, and note that with vector graphics the rendering may vary according to the device used.
Besides a circular layout, another possibility is to apply a force-directed layout for the visualization of the multiplex network. Function multigraph
provides a number of arguments for graph, edges, and nodes levels, which can be recorded in an object list named scp
to be used in the scope
argument of the function.
# define scope of node / edge / graph characteristics as list object scp <- list(directed = FALSE, cex = 6, fsize = 7, pos = 0, vcol = 8, ecol = 1, lwd = 2, bwd = .5) # plot graph with customized format multigraph(floflies, layout = "force", seed = 2, scope = scp)
# plot graph with customized format multigraph(floflies, layout = "force", seed = 2, scope = scp, lty = 2:1, pch = 13)
Note that when the graph is depicted as undirected, then the reciprocal ties by default are collapsed. You can prevent this to happen by setting the argument collRecip
to FALSE
. Some arguments such as cex
, lwd
, lty
, pch
are graphical parameters of the graphics
package to set the shape of both the vertices and the edges. Other arguments like bwd
to specify the width of the bundle type, fsize
for the size of the font used in node labels, or ecol
and vcol
for the color of respectively edges and vertices are complementary in multigraph
. Moreover, by setting the pos
argument to 0
, the actor labels are placed in the middle of the nodes.
Some actor attributes of the Florentine Families network.
flofliesatt <- multiplex::read.dl(file = "http://moreno.ss.uci.edu/padgw.dat") # or mirror flofliesatt <- multiplex::read.dl(file = "http://vlado.fmf.uni-lj.si/pub/networks/data/ucinet/padgw.dat")
Look at flofliesatt
that storages attribute information
flofliesatt WEALTH #PRIORS #TIES ACCIAIUOL 10 53 2 ALBIZZI 36 65 3 RIDOLFI 27 38 4 STROZZI 146 74 29 BARBADORI 55 0 14 BISCHERI 44 12 9 CASTELLAN 20 22 18 GUADAGNI 8 21 14 LAMBERTES 42 0 14 MEDICI 103 53 54 PAZZI 48 0 7 PERUZZI 49 42 32 SALVIATI 10 35 5 TORNABUON 48 0 7 GINORI 32 0 9 PUCCI 3 0 1
However, in order to depict the multigraph of floflies
with the information contained in flofliesatt
, be sure that the order of the actors matches in both objects.
flofliesatt <- flofliesatt[order(rownames(flofliesatt)), ] flofliesatt WEALTH #PRIORS #TIES ACCIAIUOL 10 53 2 ALBIZZI 36 65 3 BARBADORI 55 0 14 BISCHERI 44 12 9 CASTELLAN 20 22 18 GINORI 32 0 9 GUADAGNI 8 21 14 LAMBERTES 42 0 14 MEDICI 103 53 54 PAZZI 48 0 7 PERUZZI 49 42 32 PUCCI 3 0 1 RIDOLFI 27 38 4 SALVIATI 10 35 5 STROZZI 146 74 29 TORNABUON 48 0 7
Now flofliesatt
matches floflies
for the plotting.
Redefine the scope in scp
to depict this network in a way that the size of the vertices reflects the wealth of the actors.
# redefine scope of node / edge / graph characteristics scp <- list(directed = FALSE, fsize = 8, pos = 0, lwd = 2, ecol = 1, vcol = 5) # plot graph with customized format and actor attributes multigraph(floflies, layout = "force", seed = 1, scope = scp, cex = flofliesatt[,1])
The clu
argument serves to establish the clustering of the network with three classes of actors differentiated by the colors of the vertices.
# define scope of node / edge / graph characteristics scp2 <- list(directed = FALSE, fsize = 8, pos = 0, lwd = 2, ecol = "white", + vcol = c("orange","blue","white"), clu = c(1,1,1,2,2,1,2,2,1,1,2,3,1,1,2,1), alpha = c(.5, 1, .2)) # plot graph with customized format and actor attributes multigraph(floflies, layout = "force", seed = 1, scope = scp2, cex = flofliesatt[,1], bg = 1)
As a result, there are different ways to set the colors, and the alpha
vector argument serves to set the transparency of colors in vertices, edges, and the graph background.
Support for the visualization of two-mode networks is also given by multigraph
, and for the Southern Women classic dataset to illustrate some of the layout options with this package.
# read the Ucinet DL file of Davis, Gardner, Gardner Southern Women # dataset from a public repository and storage it as an object swomen <- multiplex::read.dl(file = "http://moreno.ss.uci.edu/davis.dat") # or mirror swomen <- multiplex::read.dl(file = "http://vlado.fmf.uni-lj.si/pub/networks/data/ucinet/davis.dat") ### take a look swomen E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13 E14 EVELYN 1 1 1 1 1 1 0 1 1 0 0 0 0 0 LAURA 1 1 1 0 1 1 1 1 0 0 0 0 0 0 THERESA 0 1 1 1 1 1 1 1 1 0 0 0 0 0 BRENDA 1 0 1 1 1 1 1 1 0 0 0 0 0 0 CHARLOTTE 0 0 1 1 1 0 1 0 0 0 0 0 0 0 FRANCES 0 0 1 0 1 1 0 1 0 0 0 0 0 0 ELEANOR 0 0 0 0 1 1 1 1 0 0 0 0 0 0 PEARL 0 0 0 0 0 1 0 1 1 0 0 0 0 0 RUTH 0 0 0 0 1 0 1 1 1 0 0 0 0 0 VERNE 0 0 0 0 0 0 1 1 1 0 0 1 0 0 MYRA 0 0 0 0 0 0 0 1 1 1 0 1 0 0 KATHERINE 0 0 0 0 0 0 0 1 1 1 0 1 1 1 SYLVIA 0 0 0 0 0 0 1 1 1 1 0 1 1 1 NORA 0 0 0 0 0 1 1 0 1 1 1 1 1 1 HELEN 0 0 0 0 0 0 1 1 0 1 1 1 1 1 DOROTHY 0 0 0 0 0 0 0 1 1 1 0 1 0 0 OLIVIA 0 0 0 0 0 0 0 0 1 0 1 0 0 0 FLORA 0 0 0 0 0 0 0 0 1 0 1 0 0 0
In this case, the information can be contained in a data frame or an array as before.
Function bmgraph
serves to plot two-mode data or an affiliation network as a bipartite graph.
In this case, actor and events have different shape by default.
Similarly to multigraph
the color and shape of edges and vertices can be modified by equal arguments, and we can mirror the X axis of the plot.
# define scope of node / edge / graph characteristics as list object scp3 <- list(cex = 3, fsize = 8, pch = c(19, 15), lwd = 1.5, vcol = 2:3, fsize = 7) # Plot bipartite graph with customized format and horizontal reflection bmgraph(swomen, scope = scp3, mirrorX = TRUE)
Option bip3
splits the actors in two columns, whereas bip3e
will split the events.
bmgraph(swomen, layout = "bip3", scope = scp3)
Bipartite graph with clustering information of Southern Women network as in Batagelj et al, 2014 (p. 29).
# clustering of network members for permutation clup <- list(c(8,9,7,6,1,4,2,3,5,17,18,13,16,11,10,15,14,12), c(5,1,4,2,3,9,8,7,6,11,12,10,13,14)) # clustering of network members for layout clunm <- list(c(rep(1,9),rep(2,9)),c(rep(1,5),rep(2,4),rep(3,5))) # bipartite graph with clustering bmgraph(swomen, layout = "bipc", scope = scp3, clu = clunm, perm = clup)
The binomial projection of a two-mode dataset allows obtaining a force directed layout that in this case the image is clockwise rotated 65 degrees.
bmgraph(swomen, layout = "force", seed = 1, scope = scp3, rot = 65)
Function bmgraph
stands for a bipartite multigraph because the actors can be affiliated by different means.
bmgraph(floflies, ecol = 1)
See Plot partially ordered semigroup
or
See Multilevel Structure of G20 Trade Network
or
Miscellaneous: Time and geographyFunction multigraph
with argument "new"
allows superimposing graphs over a cartographical map, for example, as with the animated plot below produced together with packages gifski
and sdam
that represents a network dynamic in ancient Mediterranean Sea (cf. Shipwrecks network in the Mediterranean Basin ).
# pseudo-code sdam::plot.map(type="med", new=TRUE) multigraph(net, ..., new=TRUE)
multiplex
version 3 or higher.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4