Mise à jour : la fonction ggnet
a été publiée dans le package GGally
(merci à Barret, qui se charge de tenir le package à jour et qui a fourni une excellente relecture du code).
J’ai terminé de travailler sur la fonction ggnet
évoquée dans un récent billet. Ça donne des graphiques comme ça :
La fonction est à présent robuste à chacune de ses options : vous pouvez omettre n’importe quel argument (sauf le premier !) et toujours obtenir quelque chose de graphiquement potable. Il reste juste une petite faiblesse sur l’option quantize.weights
, qui doit probablement planter si une classification par quartiles ne parvient pas à identifier les noeuds (les points) de manière unique.
Les exemples de la fonction couvrent les cas les plus simples avec des données simulées et montrent bien la filiation avec le code original de Moritz Marbach :
rnd = network::network.initialize(10) cat = LETTERS[rbinom(10, 4, .5)] ggnet(rnd, label = TRUE, color = "white", segment.color = "grey10", node.group = cat)
L’option label.nodes
est particulièrement flexible grâce à l’aide de Joël sur un bout du code. Un point du graphique, ou n’importe quelle série de points identifiés par l’attribut vertex.names
, peuvent être légendés, ce qui donne des combinaisons faciles avec l’argument node.group
, comme dans ce graphique qui distingue les “followers” de NKM de tous les autres :
Pour des calculs plus avancés, jetez un coup d’oeil aux fonctions du fichier functions.R
, qui simplifient un peu le boulot en calculant les “followers/followings” ou en calculant des mesures de centralité pour chaque groupe parlementaire. Les packages à consulter pour l’analyse de réseau sont les packages igraph
, network
et sna
(ou alors un logiciel comme Pajek, mais l’analyse ne sera pas réplicable comme elle peut l’être avec R).
Rajout #1 : nouvel exemple avec des données sur la répartition des sièges de grands groupes industriels et de cabinets d’avocats dans 55 villes mondiales.
En six lignes de code, dont trois pour récupérer les données :
url = url("http://networkdata.ics.uci.edu/netdata/data/cities.RData") print(load(url)) close(url) type = network::get.vertex.attribute(cities, "type") type = ifelse(grepl("City|Law", type), gsub("I+", "", type), "Firm") ggnet(cities, mode = "kamadakawai", alpha = .2, node.group = type, label = c("Paris", "Beijing", "Chicago"), color = "darkred")
Plus de données pour tester la fonction ici et là.
Rajout #2 : spécial dédicace aux carnetiers d’Hypothèses ! On reprend les données de Josquin Debaz et on représente le réseau des bloggers en décembre 2010, en pondérant les noeuds par le nombre de liens sortants :
En cinq trois lignes de code, dont quatre pour convertir le réseau au bon format :
url = "http://gspr.ehess.free.fr/media/hypothesosphere10C07.net" hyp = network::read.paj(url) ggnet(hyp, label = TRUE, size = 12, vjust = -1.5, weight = "outdegree")
Rajout #3 : le même réseau en d3 grâce au package en cours de développement d3Network, de Christopher Gangrud (cliquer sur l’aperçu pour la version interactive, hébergée ailleurs) :
Le code est encore une fois assez court, puisqu’il ne faut qu’une dizaine de lignes pour convertir de Pajek (.net
) à igraph
à d3
:
# data require(igraph) url = "http://gspr.ehess.free.fr/media/hypothesosphere10C07.net" hyp = read.graph(url, format = "pajek") df = asDF(hyp) Source = df$vertexes[df$edges$V1, 2] Target = df$vertexes[df$edges$V2, 2] df = data.frame(Source, Target) # d3Network devtools::install_github("d3Network", "christophergandrud") require(d3Network) d3Network(df, file = "hypothesosphere.html", width = 900, height = 750, fontsize = 12)
S’il vous venait l’idée de vouloir représenter le réseau des députés sur Twitter en d3, essayez ceci, mais attendez-vous à un gros amas de points qui mettra longtemps à se stabiliser :
file = "network.txt" link = "https://raw.github.com/briatte/ggnet/master/network.txt" ## downloader::download(link, file) df = read.csv(file, sep = "\t") names(df) ## devtools::install_github("d3Network", "christophergandrud") require(d3Network) d3Network(df, "network.html")
OpenEdition vous propose de citer ce billet de la manière suivante :
François (14 juin 2013). Une fonction pour passer des réseaux à ggplot2. Polit’bistro. Consulté le 10 octobre 2024 à l’adresse https://doi.org/10.58079/sypu
Really nice post. Thanks for putting this together.
You are welcome :)