#install.packages("igraph")
library("igraph")
Get the data: nfdi-collaborations.csv
# https://gist.github.com/LukasCBossert/9bd04115db3aa9ed974fdc69d3ff227c
NFDI_edges <- read.table(header=TRUE,
sep=",",
text="
from,to
DataPLANT,NFDI4BioDiversity
DataPLANT,NFDI4Chem
GHGA,NFDI4Health
KonsortSWD,BERD@NFDI
KonsortSWD,NFDI4BioDiversity
KonsortSWD,NFDI4Earth
KonsortSWD,NFDI4Health
KonsortSWD,Text+
NFDI4BioDiversity,NFDI4Earth
NFDI4BioDiversity,NFDI4Chem
NFDI4BioDiversity,NFDI4Health
NFDI4BioDiversity,KonsortSWD
NFDI4BioDiversity,DataPLANT
NFDI4Cat,FAIRmat
NFDI4Cat,NFDI4Chem
NFDI4Cat,NFDI4Ing
NFDI4Cat,DAPHNE4NFDI
NFDI4Chem,FAIRmat
NFDI4Chem,NFDI4Ing
NFDI4Chem,NFDI4Cat
NFDI4Chem,DAPHNE4NFDI
NFDI4Chem,PUNCH4NFDI
NFDI4Chem,NFDI4Health
NFDI4Chem,NFDI4BioDiversity
NFDI4Culture,Text+
NFDI4Culture,MaRDI
NFDI4Culture,NFDI4Ing
NFDI4Health,GHGA
NFDI4Health,KonsortSWD
NFDI4Health,NFDI4Chem
NFDI4Health,NFDI4Earth
NFDI4Health,NFDI4BioDiversity
NFDI4Ing,NFDI-MatWerk
NFDI4Ing,FAIRmat
NFDI4Ing,NFDI4Chem
NFDI4Ing,NFDI4Earth
NFDI4Ing,MaRDI
NFDI4Ing,Text+
NFDI4Ing,NFDI4Culture
BERD@NFDI,KonsortSWD
BERD@NFDI,MaRDI
BERD@NFDI,Text+
DAPHNE4NFDI,FAIRmat
DAPHNE4NFDI,NFDI-MatWerk
DAPHNE4NFDI,NFDI4Cat
DAPHNE4NFDI,NFDI4Chem
DAPHNE4NFDI,NFDI4Health
DAPHNE4NFDI,NFDI4Ing
DAPHNE4NFDI,PUNCH4NFDI
FAIRmat,DAPHNE4NFDI
FAIRmat,DataPLANT
FAIRmat,MaRDI
FAIRmat,NFDI-MatWerk
FAIRmat,NFDI4Cat
FAIRmat,NFDI4Chem
FAIRmat,NFDI4DataScience
FAIRmat,NFDI4Ing
FAIRmat,PUNCH4NFDI
MaRDI,BERD@NFDI
MaRDI,FAIRmat
MaRDI,NFDI-MatWerk
MaRDI,NFDI4Cat
MaRDI,NFDI4Chem
MaRDI,NFDI4Ing
MaRDI,PUNCH4NFDI
NFDI-MatWerk,DAPHNE4NFDI
NFDI-MatWerk,DataPLANT
NFDI-MatWerk,FAIRmat
NFDI-MatWerk,MaRDI
NFDI-MatWerk,NFDI4Chem
NFDI-MatWerk,NFDI4DataScience
NFDI-MatWerk,NFDI4Ing
NFDI4DataScience,KonsortSWD
NFDI4DataScience,MaRDI
NFDI4DataScience,NFDI-MatWerk
NFDI4DataScience,NFDI4BioDiversity
NFDI4DataScience,NFDI4Cat
NFDI4DataScience,NFDI4Chem
NFDI4DataScience,NFDI4Culture
NFDI4DataScience,NFDI4Health
NFDI4DataScience,NFDI4Ing
NFDI4DataScience,NFDI4Microbiota
NFDI4Earth,DataPLANT
NFDI4Earth,GHGA
NFDI4Earth,KonsortSWD
NFDI4Earth,NFDI4BioDiversity
NFDI4Earth,NFDI4Cat
NFDI4Earth,NFDI4Chem
NFDI4Earth,NFDI4Culture
NFDI4Earth,NFDI4Health
NFDI4Earth,NFDI4Ing
NFDI4Microbiota,DataPLANT
NFDI4Microbiota,GHGA
NFDI4Microbiota,NFDI4BioDiversity
NFDI4Microbiota,NFDI4Chem
NFDI4Microbiota,NFDI4DataScience
NFDI4Microbiota,NFDI4Health
NFDI4Microbiota,NFDI4Ing
PUNCH4NFDI,DAPHNE4NFDI
PUNCH4NFDI,FAIRmat
PUNCH4NFDI,GHGA
PUNCH4NFDI,MaRDI
PUNCH4NFDI,NFDI4Earth
PUNCH4NFDI,NFDI4Ing
Text+,KonsortSWD
Text+,NFDI4BioDiversity
Text+,NFDI4Culture
Text+,NFDI4Earth
Text+,NFDI4Ing
")
head(NFDI_edges)
from | to | |
---|---|---|
<fct> | <fct> | |
1 | DataPLANT | NFDI4BioDiversity |
2 | DataPLANT | NFDI4Chem |
3 | GHGA | NFDI4Health |
4 | KonsortSWD | BERD@NFDI |
5 | KonsortSWD | NFDI4BioDiversity |
6 | KonsortSWD | NFDI4Earth |
NFDI_network <- graph_from_data_frame(NFDI_edges,
directed = FALSE
)
head(NFDI_network)
[[ suppressing 19 column names ‘DataPLANT’, ‘GHGA’, ‘KonsortSWD’ ... ]]
6 x 19 sparse Matrix of class "dgCMatrix"
DataPLANT . . . 2 . 1 . . . . . 1 . 1 . 1 1 . .
GHGA . . . . . . . 2 . . . . . . . 1 1 1 .
KonsortSWD . . . 2 . . . 2 . 2 . . . . 1 2 . . 2
NFDI4BioDiversity 2 . 2 . . 2 . 2 . . . . . . 1 2 1 . 1
NFDI4Cat . . . . . 2 . . 1 . 2 2 1 . 1 1 . . .
NFDI4Chem 1 . . 2 2 . . 2 2 . 2 2 1 1 1 1 1 1 .
plot(NFDI_network) # loading data frame
set.seed(9876543)
plot(NFDI_network, # loading data frame
main = "NFDI Network", # adding a title
frame = TRUE # making a frame
)
set.seed(9876543)
plot(NFDI_network, # loading data frame
main = "NFDI Network", # adding a title
frame = TRUE, # making a frame
layout = layout.graphopt, #* better layout options
)
The network is now already better structured and the distances between the nodes are more harmonious.
If you like, you can try out further layout settings:
layout.circle
(circle,circular
): Deterministic layout that places the vertices on a circlelayout.drl
(drl
): The Distributed Recursive Layout algorithm for large graphslayout.fruchterman.reingold
(fr
): Fruchterman-Reingold force-directed algorithmlayout.kamada.kawai
(kk
): Kamada-Kawai force-directed algorithmlayout.lgl
(large, lgl, large_graph
): The Large Graph Layout algorithm for large graphslayout.random
(random
): Places the vertices completely randomlylayout.reingold.tilford
(rt, tree
): Reingold-Tilford tree layout, useful for (almost) tree-like graphslayout.sphere
(sphere,spherical,circular_3d
): Deterministic layout that places the vertices evenly on the surface of a sphere
set.seed(9876543)
plot(NFDI_network, # loading data frame
main = "NFDI Network", # adding a title
frame = TRUE, # making a frame
layout = layout.graphopt, # better layout options
vertex.color = "#ffcc66", #* color of nodes
vertex.frame.color = "#ffcc66", #* color of the frame of nodes
vertex.label.cex = 0.5, #* size of the description of the labels
vertex.label.color = "black", #* color of the description
edge.color = "#808080", #* color of edges
edge.curved = 0.1, #* factor of "curvity"
)
degree(NFDI_network) #* calculate number of edges
- DataPLANT
- 7
- GHGA
- 5
- KonsortSWD
- 11
- NFDI4BioDiversity
- 13
- NFDI4Cat
- 10
- NFDI4Chem
- 19
- NFDI4Culture
- 7
- NFDI4Health
- 13
- NFDI4Ing
- 19
- BERD@NFDI
- 5
- DAPHNE4NFDI
- 12
- FAIRmat
- 16
- MaRDI
- 14
- NFDI-MatWerk
- 12
- NFDI4DataScience
- 13
- NFDI4Earth
- 15
- NFDI4Microbiota
- 8
- PUNCH4NFDI
- 10
- Text+
- 9
set.seed(9876543)
plot(NFDI_network, # loading data frame
main = "NFDI-Netzwerk", # adding a title
frame = TRUE, # making a frame
layout = layout.graphopt, # better layout options
vertex.color = "#ffcc66", # color of nodes
vertex.frame.color = "#ffcc66", # color of the frame of nodes
vertex.label.cex = 0.5, # size of the description of the labels
vertex.label.color = "black", # color of the description
# color: https://www.w3schools.com/colors/colors_picker.asp
edge.color = "#808080", # color of edges
edge.curved = 0.1, # factor of "curvity"
vertex.size = degree(NFDI_network), #* size of nodes depends on amount of edges
)
NFDI_network_directed <- graph_from_data_frame(NFDI_edges,
directed = TRUE
)
set.seed(9876543)
plot(NFDI_network_directed, #<<<<<<< loading data frame
main = "NFDI-Netzwerk", # adding a title
frame = TRUE, # making a frame
layout = layout.graphopt, # better layout options
vertex.color = "#ffcc66", # color of nodes
vertex.frame.color = "#ffcc66", # color of the frame of nodes
vertex.label.cex = 0.5, # size of the description of the labels
vertex.label.color = "black", # color of the description
# color: https://www.w3schools.com/colors/colors_picker.asp
edge.color = "#808080", # color of edges
edge.curved = 0, #<<<<<<<<< factor of "curvity"
vertex.size = degree(NFDI_network_directed), #<<<<<< size of nodes depends on amount of edges
edge.arrow.size = .5, #* arrow size, defaults to 1
)
Get the data: nfdi-consortia.csv
# https://gist.github.com/LukasCBossert/ce56ebd0059b4879c7d11c1090118c25
NFDI_nodes <- read.table(header=TRUE,
sep=",",
text="
name,group,round
DataPLANT,2,1
GHGA,1,1
KonsortSWD,3,1
NFDI4BioDiversity,2,1
NFDI4Cat,5,1
NFDI4Chem,5,1
NFDI4Culture,3,1
NFDI4Health,1,1
NFDI4Ing,4,1
BERD@NFDI,3,2
DAPHNE4NFDI,5,2
FAIRmat,5,2
MaRDI,4,2
NFDI-MatWerk,4,2
NFDI4DataScience,4,2
NFDI4Earth,2,2
NFDI4Microbiota,2,2
PUNCH4NFDI,5,2
Text+,3,2
")
head(NFDI_nodes) # check if data is loaded correctly
name | group | round | |
---|---|---|---|
<fct> | <int> | <int> | |
1 | DataPLANT | 2 | 1 |
2 | GHGA | 1 | 1 |
3 | KonsortSWD | 3 | 1 |
4 | NFDI4BioDiversity | 2 | 1 |
5 | NFDI4Cat | 5 | 1 |
6 | NFDI4Chem | 5 | 1 |
NFDI_network_directed <- graph_from_data_frame(d = NFDI_edges, # d = data frame =~ edges
vertices = NFDI_nodes, #nodes
directed = TRUE) #directed
NFDI_color_year <- c("lightgreen", # 2019 (1)
"lightblue" # 2020 (2)
)
NFDI_color_groups <- NFDI_color_year[
as.numeric(as.factor(
V(NFDI_network_directed)$round))] # <<<< based on the round
set.seed(9876543)
plot(NFDI_network_directed, # loading data frame
main = "NFDI-Network (<Funding year>)", #<<<<<<<< adding a title
frame = TRUE, # making a frame
layout = layout.graphopt, # better layout options
vertex.color = NFDI_color_groups, #<<<<<<<<<< color of nodes
vertex.frame.color = NFDI_color_groups, #<<<<<<<<<< color of the frame of nodes
vertex.label.cex = 0.5, # size of the description of the labels
vertex.label.color = "black", # color of the description
# color: https://www.w3schools.com/colors/colors_picker.asp
edge.color = "#808080", # color of edges
edge.curved = 0, # factor of "curvity"
vertex.size = degree(NFDI_network_directed,
mode = "total"), #<<<<<<<<<<< size of nodes depends on amount of edges
edge.arrow.size = .5, # arrow size, defaults to 1
)
NFDI_color_code <- c("#f5ac9f", # Medicine
"#e43516", # Life Sciences
"#f9b900", # Humanities
"#007aaf", # Engineering Sciences
"#6ca11d" # Chemistry/Physics
)
NFDI_color_groups <- NFDI_color_code[
as.numeric(as.factor(
V(NFDI_network_directed)$group))]
set.seed(9876543)
plot(NFDI_network_directed, # loading data frame
main = "NFDI-Network (<NFDI conference systematics>)", #<<<<<<<< adding a title
frame = TRUE, # making a frame
layout = layout.graphopt, # better layout options
vertex.color = NFDI_color_groups, #<<<<<<<<<< color of nodes
vertex.frame.color = NFDI_color_groups, #<<<<<<<<<< color of the frame of nodes
vertex.label.cex = 0.5, # size of the description of the labels
vertex.label.color = "black", # color of the description
# color: https://www.w3schools.com/colors/colors_picker.asp
edge.color = "#808080", # color of edges
edge.curved = 0, # factor of "curvity"
vertex.size = degree(NFDI_network_directed,
mode = "total"), #<<<<<<<<<<< size of nodes depends on amount of edges
edge.arrow.size = .5, # arrow size, defaults to 1
)
nfdi_plot_legend <- function(){
legend("topleft", # x-position
title = "NFDI conference systematics", # title
legend = c(
"(1) Medicine",
"(2) Life Sciences",
"(3) Humanities",
"(4) Engineering Sciences",
"(5) Chemistry/Physics"
), # the text of the legend
col = NFDI_color_code , # colors of lines and points beside the legend text
pch = 20, # the plotting symbols appearing in the legend
bty = "n", # no frame, the type of box to be drawn around the legend (n=no frame)
cex = .75, # character expansion factor relative to current par("cex").
pt.cex = 2 # expansion factor(s) for the points
)
}
set.seed(9876543)
plot(NFDI_network_directed, # loading data frame
main = "NFDI Network (<NFDI conference systematics>)", #<<<<<<<< adding a title
frame = TRUE, # making a frame
layout = layout.graphopt, # better layout options
vertex.color = NFDI_color_groups, # color of nodes
vertex.frame.color = NFDI_color_groups, # color of the frame of nodes
vertex.label.cex = 0.5, # size of the description of the labels
vertex.label.color = "black", # color of the description
# color: https://www.w3schools.com/colors/colors_picker.asp
edge.color = "#808080", # color of edges
edge.curved = 0, # factor of "curvity"
vertex.size = degree(NFDI_network_directed,
mode = "total"), #<<<<<<<<<<< size of nodes depends on amount of edges
edge.arrow.size = .5, # arrow size, defaults to 1
)
nfdi_plot_legend() # <<<< add the legend to the plot
nfdi_plot_group <- function(NFDI_name) {
set.seed(9876543)
nfdi_local_network <- function(NFDI_name) {
plot(NFDI_network_directed,
main = "NFDI Network (<NFDI conference systematics>)", # adding a title
sub = NFDI_name,
frame = TRUE, # making a frame
layout = layout.graphopt, # better layout options
vertex.color = NFDI_color_groups, # color of nodes
vertex.frame.color = NFDI_color_groups, # color of the frame of nodes
vertex.label.cex = 0.5, # size of the description of the labels
vertex.label.color = "black", # color of the description
# color: https://www.w3schools.com/colors/colors_picker.asp
edge.curved = 0.2, # factor of "curvity"
vertex.size = degree(NFDI_network_directed,
mode = "total"), #<<<<<<<<<<< size of nodes depends on amount of edges
edge.arrow.size = .5, # arrow size, defaults to 1
edge.color = with(NFDI_edges,
ifelse(from %in% NFDI_name,"#808080", # grey
ifelse(to == NFDI_name,"#000000", # black
NA)))
)
nfdi_plot_legend()
}
####################################################
### ! important!
### If you want to export the plots,
### you need to create a folder called "img" first.
####################################################
# pdf(paste0("img/network_group_",NFDI_name,".pdf")) # save image as PDF
# nfdi_local_network(NFDI_name) # display image for saving
# dev.off() # close image stream
nfdi_local_network(NFDI_name) # display image in JupyterNotebook
}
nfdi_plot_group("NFDI4Ing")
nfdi_plot_group("NFDI4Microbiota")
I love loops....
for (name in NFDI_nodes$name){
nfdi_plot_group(name)
}
We have done the network visualization and analysis using only the package 'igraph'. Now you have to save the result, e.g. under "File" --> "Save and Checkpoint". You can also download the JupyterNotebook, there are several formats available.
If you have created the network with the RNoteBook, you can call it up again at any time via the URL and you can make further modifications in the network.
There are other exciting occupations with this network. For example, you can also create an interactive network or display the network as a pie chart. Have a look at the overview on https://www.r-graph-gallery.com/network.html.