Une fonction pour passer des réseaux à ggplot2

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 :

example3

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)

rnd

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 :

example4

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.

cities

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 .

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 :

hypo.net

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) :

d3Network screenshot

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")

2 réflexions au sujet de « Une fonction pour passer des réseaux à ggplot2 »

Les commentaires sont fermés.