Dans ce billet, je vais me focaliser principalement sur ggraph
, et j’essaierai de trouver le temps pour parler un peu plus en profondeur de tidygraph un peu plus tard dans un autre billet.
Données
Nous allons travailler sur cette table qui renseigne les noeuds de notre réseau, et cette autre table qui renseigne les liens.
nodes=read_csv("../../lise.vaudor/Rdata/Graphes_et_tidyverse_ggraph/vertices.csv")
edges=read_csv("../../lise.vaudor/Rdata/Graphes_et_tidyverse_ggraph/edges.csv")
Pour aujourd’hui, je vais utiliser une fonction de tidygraph (tbl_graph()
) pour former à partir de ces deux tables un objet de type graphe (et même, plus précisément, de classe “tbl_graph”). Je passe rapidement sur cette étape, car j’y reviendrai très bientôt dans un autre billet…
tib_g=tidygraph::tbl_graph(nodes=nodes,edges=edges)
De la même manière qu’avec la fonction ggplot()
du package ggplot2
, je crée ma première “couche” avec la fonction ggraph()
du package ggraph
:
g=tib_g %>%
ggraph(layout="auto")
Pour l’instant, il n’y a rien à voir… mais je vais ensuite pouvoir exploiter les possibilités de ggraph
pour la représentation des noeuds et des liens.
Représentation des noeuds
D’abord, voici les possibilités pour les noeuds:
flowrpowr::flowr_package("ggraph",element="geom_node", layout="sugiyama")
Toutes n’ont pas forcément un intérêt dans notre cas (c’est fonction de la structure de notre graphe) donc je ne les testerai pas toutes, mais en voici quelques-unes adaptées à notre cas:
g1=g + geom_node_point(color="goldenrod",size=3)
g2=g + geom_node_label(aes(label=name),fill="steelblue",alpha=0.2)
g3=g + geom_node_text(aes(label=name), color="olivedrab")
g4=g + geom_node_circle(aes(fill=gender, r=0.3))
library(patchwork)
(g1+g2)/(g3+g4)
Notez que l’on retrouve les traits les plus commodes de ggplot2, comme l’argument “mapping” qui permet de relier certaines caractéristiques des geoms à certaines variables dans notre jeu de données…
Représentation des liens
Maintenant, voyons les possibilités pour la représentation des liens:
flowrpowr::flowr_package("ggraph",element="geom_edge", layout="sugiyama")
Et à nouveau, testons quelques-unes des possibilités:
g11=g1+geom_edge_link(color="steelblue")
g12=g1+geom_edge_arc(color="coral")
g13=g1+geom_edge_link(aes(edge_width=weight),color="olivedrab", alpha=0.2)
g14=g1+geom_edge_link(aes(edge_colour=relationship))
(g11+g13)/(g12+g14)
Facettes, échelles, etc.
Evidemment, pour un “vrai” graphe, on va jouer sur tout en même temps (les noeuds, les liens, la superposition des couches, les esthétiques, etc.). ggraph
permet également de créer des facettes d’un même graphe soit en fonction des noeuds, soit en fonction des liens
gf=g +
geom_edge_link(aes(edge_colour=relationship),
alpha=0.3, edge_width=2)+
geom_node_label(aes(label=name, fill=gender),
alpha=0.3, label.size=0)+
scale_edge_color_manual(values=c("couple"="red",
"friends"="blue",
"colleagues"="dark grey"))+
scale_fill_manual(values=c("man"="yellow","woman"="orange"))+
ggplot2::scale_x_continuous(expand=ggplot2::expand_scale(mult=0.1))
gf
(la dernière ligne me permet simplement d’étendre légèrement l’échelle des abscisses afin que les noms ne soient pas coupés sur les bords…)
On peut enfin facetter notre figure pour distinguer différents sous-graphes, en lien soit avec une variable catégorielle décrivant les noeuds (facet_nodes()
), soit avec une variable catégorielle décrivant les liens (facet_edges()
).
gf_e=gf + facet_edges(~relationship)
gf_n=gf + facet_nodes(~gender)
gf_e/gf_n