Introduction
La principale préoccupation lors de la conception d’une visualisation de réseau est l’objectif qu’elle doit servir. Quelles sont les propriétés structurelles que nous souhaitons mettre en évidence ? Quelles sont les principales préoccupations auxquelles nous voulons répondre ?
Les cartes de réseau sont loin d’être la seule visualisation disponible pour les graphiques - d’autres formats de représentation de réseau, et même de simples graphiques de caractéristiques clés, peuvent être plus appropriés dans certains cas.
Dans les cartes de réseau, comme dans d’autres formats de visualisation, nous avons plusieurs éléments clés qui contrôlent le résultat. Les principaux sont la couleur, la taille, la forme et la position.
Les mises en page graphiques modernes sont optimisées pour la vitesse et l’esthétique. En particulier, ils cherchent à minimiser les chevauchements et les croisements de bords, et à assurer une longueur de bord similaire sur tout le graphique.
Les principaux packages que nous allons utiliser sont igraph (maintenu par Gabor Csardi et Tamas Nepusz , sna & network (maintenu par Carter Butts et l’ équipe Statnet ), ggraph (maintenu par Thomas Lin Pederson ), visNetwork (maintenu par Benoit Thieurmel ), threejs (maintenu par Bryan W. Lewis ), NetworkD3 (maintenu par Christopher Gandrud ) et ndtv (maintenu par Skye Bender-deMoll ).
#install.packages("igraph")
#install.packages("network")
#install.packages("sna")
#install.packages("ggraph")
#install.packages("visNetwork")
#install.packages("threejs")
#install.packages("networkD3")
#install.packages("ndtv")
Les couleurs sont jolies, mais plus important encore, elles aident les gens à différencier les types d’objets ou les niveaux d’un attribut. Dans la plupart des fonctions R, vous pouvez utiliser des valeurs nommées colors , hex ou RGB .
Dans le diagramme de tracé de base R simple ci-dessous, xet ysont les coordonnées du point, pchest la forme du symbole du point, cexest la taille du point et colest la couleur. Pour voir les paramètres de tracé en base R, consultez ?
plot(x=1:10, y=rep(5,10), pch=19, cex=3, col="dark red")
points(x=1:10, y=rep(6, 10), pch=19, cex=3, col="557799")
points(x=1:10, y=rep(4, 10), pch=19, cex=3, col=rgb(.25, .5, .3))
Vous remarquerez peut-être que RVB varie ici de 0 à 1. Bien qu’il s’agisse de la valeur par défaut R, vous pouvez également la définir sur la plage 0-255 en utilisant quelque chose comme rgb(10, 100, 100, maxColorValue=255).
Nous pouvons définir l’opacité/transparence d’un élément à l’aide du paramètre \(\alpha\) (plage 0-1) :
plot(x=1:5, y=rep(5,5), pch=19, cex=12, col=rgb(.25, .5, .3, alpha=.5), xlim=c(0,6))
Si nous avons une représentation de couleur hexadécimale, nous pouvons définir la transparence alpha en utilisant adjustcolorfrom package grDevices. Pour le plaisir, définissons également l’arrière-plan du tracé en gris à l’aide de la par()fonction des paramètres graphiques. Nous ne le ferons pas ci-dessous, mais nous pourrions définir les marges du tracé avec par(mar=c(bottom, left, top, right)), ou dire à R de ne pas effacer le tracé précédent avant d’en ajouter un nouveau avec par(new=TRUE).
par(bg="gray40")
col.tr <- grDevices::adjustcolor("557799", alpha=0.7)
plot(x=1:5, y=rep(5,5), pch=19, cex=12, col=col.tr, xlim=c(0,6))
Si vous envisagez d’utiliser les noms de couleurs intégrés, voici comment les répertorier :
colors()
## [1] "white" "aliceblue" "antiquewhite"
## [4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
## [7] "antiquewhite4" "aquamarine" "aquamarine1"
## [10] "aquamarine2" "aquamarine3" "aquamarine4"
## [13] "azure" "azure1" "azure2"
## [16] "azure3" "azure4" "beige"
## [19] "bisque" "bisque1" "bisque2"
## [22] "bisque3" "bisque4" "black"
## [25] "blanchedalmond" "blue" "blue1"
## [28] "blue2" "blue3" "blue4"
## [31] "blueviolet" "brown" "brown1"
## [34] "brown2" "brown3" "brown4"
## [37] "burlywood" "burlywood1" "burlywood2"
## [40] "burlywood3" "burlywood4" "cadetblue"
## [43] "cadetblue1" "cadetblue2" "cadetblue3"
## [46] "cadetblue4" "chartreuse" "chartreuse1"
## [49] "chartreuse2" "chartreuse3" "chartreuse4"
## [52] "chocolate" "chocolate1" "chocolate2"
## [55] "chocolate3" "chocolate4" "coral"
## [58] "coral1" "coral2" "coral3"
## [61] "coral4" "cornflowerblue" "cornsilk"
## [64] "cornsilk1" "cornsilk2" "cornsilk3"
## [67] "cornsilk4" "cyan" "cyan1"
## [70] "cyan2" "cyan3" "cyan4"
## [73] "darkblue" "darkcyan" "darkgoldenrod"
## [76] "darkgoldenrod1" "darkgoldenrod2" "darkgoldenrod3"
## [79] "darkgoldenrod4" "darkgray" "darkgreen"
## [82] "darkgrey" "darkkhaki" "darkmagenta"
## [85] "darkolivegreen" "darkolivegreen1" "darkolivegreen2"
## [88] "darkolivegreen3" "darkolivegreen4" "darkorange"
## [91] "darkorange1" "darkorange2" "darkorange3"
## [94] "darkorange4" "darkorchid" "darkorchid1"
## [97] "darkorchid2" "darkorchid3" "darkorchid4"
## [100] "darkred" "darksalmon" "darkseagreen"
## [103] "darkseagreen1" "darkseagreen2" "darkseagreen3"
## [106] "darkseagreen4" "darkslateblue" "darkslategray"
## [109] "darkslategray1" "darkslategray2" "darkslategray3"
## [112] "darkslategray4" "darkslategrey" "darkturquoise"
## [115] "darkviolet" "deeppink" "deeppink1"
## [118] "deeppink2" "deeppink3" "deeppink4"
## [121] "deepskyblue" "deepskyblue1" "deepskyblue2"
## [124] "deepskyblue3" "deepskyblue4" "dimgray"
## [127] "dimgrey" "dodgerblue" "dodgerblue1"
## [130] "dodgerblue2" "dodgerblue3" "dodgerblue4"
## [133] "firebrick" "firebrick1" "firebrick2"
## [136] "firebrick3" "firebrick4" "floralwhite"
## [139] "forestgreen" "gainsboro" "ghostwhite"
## [142] "gold" "gold1" "gold2"
## [145] "gold3" "gold4" "goldenrod"
## [148] "goldenrod1" "goldenrod2" "goldenrod3"
## [151] "goldenrod4" "gray" "gray0"
## [154] "gray1" "gray2" "gray3"
## [157] "gray4" "gray5" "gray6"
## [160] "gray7" "gray8" "gray9"
## [163] "gray10" "gray11" "gray12"
## [166] "gray13" "gray14" "gray15"
## [169] "gray16" "gray17" "gray18"
## [172] "gray19" "gray20" "gray21"
## [175] "gray22" "gray23" "gray24"
## [178] "gray25" "gray26" "gray27"
## [181] "gray28" "gray29" "gray30"
## [184] "gray31" "gray32" "gray33"
## [187] "gray34" "gray35" "gray36"
## [190] "gray37" "gray38" "gray39"
## [193] "gray40" "gray41" "gray42"
## [196] "gray43" "gray44" "gray45"
## [199] "gray46" "gray47" "gray48"
## [202] "gray49" "gray50" "gray51"
## [205] "gray52" "gray53" "gray54"
## [208] "gray55" "gray56" "gray57"
## [211] "gray58" "gray59" "gray60"
## [214] "gray61" "gray62" "gray63"
## [217] "gray64" "gray65" "gray66"
## [220] "gray67" "gray68" "gray69"
## [223] "gray70" "gray71" "gray72"
## [226] "gray73" "gray74" "gray75"
## [229] "gray76" "gray77" "gray78"
## [232] "gray79" "gray80" "gray81"
## [235] "gray82" "gray83" "gray84"
## [238] "gray85" "gray86" "gray87"
## [241] "gray88" "gray89" "gray90"
## [244] "gray91" "gray92" "gray93"
## [247] "gray94" "gray95" "gray96"
## [250] "gray97" "gray98" "gray99"
## [253] "gray100" "green" "green1"
## [256] "green2" "green3" "green4"
## [259] "greenyellow" "grey" "grey0"
## [262] "grey1" "grey2" "grey3"
## [265] "grey4" "grey5" "grey6"
## [268] "grey7" "grey8" "grey9"
## [271] "grey10" "grey11" "grey12"
## [274] "grey13" "grey14" "grey15"
## [277] "grey16" "grey17" "grey18"
## [280] "grey19" "grey20" "grey21"
## [283] "grey22" "grey23" "grey24"
## [286] "grey25" "grey26" "grey27"
## [289] "grey28" "grey29" "grey30"
## [292] "grey31" "grey32" "grey33"
## [295] "grey34" "grey35" "grey36"
## [298] "grey37" "grey38" "grey39"
## [301] "grey40" "grey41" "grey42"
## [304] "grey43" "grey44" "grey45"
## [307] "grey46" "grey47" "grey48"
## [310] "grey49" "grey50" "grey51"
## [313] "grey52" "grey53" "grey54"
## [316] "grey55" "grey56" "grey57"
## [319] "grey58" "grey59" "grey60"
## [322] "grey61" "grey62" "grey63"
## [325] "grey64" "grey65" "grey66"
## [328] "grey67" "grey68" "grey69"
## [331] "grey70" "grey71" "grey72"
## [334] "grey73" "grey74" "grey75"
## [337] "grey76" "grey77" "grey78"
## [340] "grey79" "grey80" "grey81"
## [343] "grey82" "grey83" "grey84"
## [346] "grey85" "grey86" "grey87"
## [349] "grey88" "grey89" "grey90"
## [352] "grey91" "grey92" "grey93"
## [355] "grey94" "grey95" "grey96"
## [358] "grey97" "grey98" "grey99"
## [361] "grey100" "honeydew" "honeydew1"
## [364] "honeydew2" "honeydew3" "honeydew4"
## [367] "hotpink" "hotpink1" "hotpink2"
## [370] "hotpink3" "hotpink4" "indianred"
## [373] "indianred1" "indianred2" "indianred3"
## [376] "indianred4" "ivory" "ivory1"
## [379] "ivory2" "ivory3" "ivory4"
## [382] "khaki" "khaki1" "khaki2"
## [385] "khaki3" "khaki4" "lavender"
## [388] "lavenderblush" "lavenderblush1" "lavenderblush2"
## [391] "lavenderblush3" "lavenderblush4" "lawngreen"
## [394] "lemonchiffon" "lemonchiffon1" "lemonchiffon2"
## [397] "lemonchiffon3" "lemonchiffon4" "lightblue"
## [400] "lightblue1" "lightblue2" "lightblue3"
## [403] "lightblue4" "lightcoral" "lightcyan"
## [406] "lightcyan1" "lightcyan2" "lightcyan3"
## [409] "lightcyan4" "lightgoldenrod" "lightgoldenrod1"
## [412] "lightgoldenrod2" "lightgoldenrod3" "lightgoldenrod4"
## [415] "lightgoldenrodyellow" "lightgray" "lightgreen"
## [418] "lightgrey" "lightpink" "lightpink1"
## [421] "lightpink2" "lightpink3" "lightpink4"
## [424] "lightsalmon" "lightsalmon1" "lightsalmon2"
## [427] "lightsalmon3" "lightsalmon4" "lightseagreen"
## [430] "lightskyblue" "lightskyblue1" "lightskyblue2"
## [433] "lightskyblue3" "lightskyblue4" "lightslateblue"
## [436] "lightslategray" "lightslategrey" "lightsteelblue"
## [439] "lightsteelblue1" "lightsteelblue2" "lightsteelblue3"
## [442] "lightsteelblue4" "lightyellow" "lightyellow1"
## [445] "lightyellow2" "lightyellow3" "lightyellow4"
## [448] "limegreen" "linen" "magenta"
## [451] "magenta1" "magenta2" "magenta3"
## [454] "magenta4" "maroon" "maroon1"
## [457] "maroon2" "maroon3" "maroon4"
## [460] "mediumaquamarine" "mediumblue" "mediumorchid"
## [463] "mediumorchid1" "mediumorchid2" "mediumorchid3"
## [466] "mediumorchid4" "mediumpurple" "mediumpurple1"
## [469] "mediumpurple2" "mediumpurple3" "mediumpurple4"
## [472] "mediumseagreen" "mediumslateblue" "mediumspringgreen"
## [475] "mediumturquoise" "mediumvioletred" "midnightblue"
## [478] "mintcream" "mistyrose" "mistyrose1"
## [481] "mistyrose2" "mistyrose3" "mistyrose4"
## [484] "moccasin" "navajowhite" "navajowhite1"
## [487] "navajowhite2" "navajowhite3" "navajowhite4"
## [490] "navy" "navyblue" "oldlace"
## [493] "olivedrab" "olivedrab1" "olivedrab2"
## [496] "olivedrab3" "olivedrab4" "orange"
## [499] "orange1" "orange2" "orange3"
## [502] "orange4" "orangered" "orangered1"
## [505] "orangered2" "orangered3" "orangered4"
## [508] "orchid" "orchid1" "orchid2"
## [511] "orchid3" "orchid4" "palegoldenrod"
## [514] "palegreen" "palegreen1" "palegreen2"
## [517] "palegreen3" "palegreen4" "paleturquoise"
## [520] "paleturquoise1" "paleturquoise2" "paleturquoise3"
## [523] "paleturquoise4" "palevioletred" "palevioletred1"
## [526] "palevioletred2" "palevioletred3" "palevioletred4"
## [529] "papayawhip" "peachpuff" "peachpuff1"
## [532] "peachpuff2" "peachpuff3" "peachpuff4"
## [535] "peru" "pink" "pink1"
## [538] "pink2" "pink3" "pink4"
## [541] "plum" "plum1" "plum2"
## [544] "plum3" "plum4" "powderblue"
## [547] "purple" "purple1" "purple2"
## [550] "purple3" "purple4" "red"
## [553] "red1" "red2" "red3"
## [556] "red4" "rosybrown" "rosybrown1"
## [559] "rosybrown2" "rosybrown3" "rosybrown4"
## [562] "royalblue" "royalblue1" "royalblue2"
## [565] "royalblue3" "royalblue4" "saddlebrown"
## [568] "salmon" "salmon1" "salmon2"
## [571] "salmon3" "salmon4" "sandybrown"
## [574] "seagreen" "seagreen1" "seagreen2"
## [577] "seagreen3" "seagreen4" "seashell"
## [580] "seashell1" "seashell2" "seashell3"
## [583] "seashell4" "sienna" "sienna1"
## [586] "sienna2" "sienna3" "sienna4"
## [589] "skyblue" "skyblue1" "skyblue2"
## [592] "skyblue3" "skyblue4" "slateblue"
## [595] "slateblue1" "slateblue2" "slateblue3"
## [598] "slateblue4" "slategray" "slategray1"
## [601] "slategray2" "slategray3" "slategray4"
## [604] "slategrey" "snow" "snow1"
## [607] "snow2" "snow3" "snow4"
## [610] "springgreen" "springgreen1" "springgreen2"
## [613] "springgreen3" "springgreen4" "steelblue"
## [616] "steelblue1" "steelblue2" "steelblue3"
## [619] "steelblue4" "tan" "tan1"
## [622] "tan2" "tan3" "tan4"
## [625] "thistle" "thistle1" "thistle2"
## [628] "thistle3" "thistle4" "tomato"
## [631] "tomato1" "tomato2" "tomato3"
## [634] "tomato4" "turquoise" "turquoise1"
## [637] "turquoise2" "turquoise3" "turquoise4"
## [640] "violet" "violetred" "violetred1"
## [643] "violetred2" "violetred3" "violetred4"
## [646] "wheat" "wheat1" "wheat2"
## [649] "wheat3" "wheat4" "whitesmoke"
## [652] "yellow" "yellow1" "yellow2"
## [655] "yellow3" "yellow4" "yellowgreen"
grep("blue", colors(), value=T)
## [1] "aliceblue" "blue" "blue1" "blue2"
## [5] "blue3" "blue4" "blueviolet" "cadetblue"
## [9] "cadetblue1" "cadetblue2" "cadetblue3" "cadetblue4"
## [13] "cornflowerblue" "darkblue" "darkslateblue" "deepskyblue"
## [17] "deepskyblue1" "deepskyblue2" "deepskyblue3" "deepskyblue4"
## [21] "dodgerblue" "dodgerblue1" "dodgerblue2" "dodgerblue3"
## [25] "dodgerblue4" "lightblue" "lightblue1" "lightblue2"
## [29] "lightblue3" "lightblue4" "lightskyblue" "lightskyblue1"
## [33] "lightskyblue2" "lightskyblue3" "lightskyblue4" "lightslateblue"
## [37] "lightsteelblue" "lightsteelblue1" "lightsteelblue2" "lightsteelblue3"
## [41] "lightsteelblue4" "mediumblue" "mediumslateblue" "midnightblue"
## [45] "navyblue" "powderblue" "royalblue" "royalblue1"
## [49] "royalblue2" "royalblue3" "royalblue4" "skyblue"
## [53] "skyblue1" "skyblue2" "skyblue3" "skyblue4"
## [57] "slateblue" "slateblue1" "slateblue2" "slateblue3"
## [61] "slateblue4" "steelblue" "steelblue1" "steelblue2"
## [65] "steelblue3" "steelblue4"
Dans de nombreux cas, nous avons besoin d’un certain nombre de couleurs contrastées ou de plusieurs nuances d’une couleur. R est livré avec une fonction de palette prédéfinie qui peut les générer pour nous. Par exemple:
pal1 <- heat.colors(5, alpha=1)
pal2 <- rainbow(5, alpha=.5)
plot(x=1:10, y=1:10, pch=19, cex=5, col=pal1)
plot(x=1:10, y=1:10, pch=19, cex=5, col=pal2)
Nous pouvons également générer nos propres dégradés en utilisant colorRampPalette. Notez que colorRampPaletterenvoie une fonction que nous pouvons utiliser pour générer autant de couleurs à partir de cette palette que nécessaire.
palf <- colorRampPalette(c("gray80", "dark red"))
plot(x=10:1, y=1:10, pch=19, cex=5, col=palf(10))
Pour ajouter de la transparence à colorRampPalette, vous devez utiliser un paramètrealpha=TRUE
palf <- colorRampPalette(c(rgb(1,1,1, .2),rgb(.8,0,0, .7)), alpha=TRUE)
plot(x=10:1, y=1:10, pch=19, cex=5, col=palf(10))
Nous travaillerons principalement avec deux petits exemples de jeux de données. Les deux contiennent des données sur les organisations médiatiques. L’un implique un réseau d’hyperliens et de mentions parmi les sources d’information. Le second est un réseau de liens entre les lieux médiatiques et les consommateurs.
Bien que les données d’exemple utilisées ici soient petites, de nombreuses idées derrière les visualisations que nous allons générer s’appliquent aux réseaux à moyenne et grande échelle. C’est aussi la raison pour laquelle on utilisera rarement certaines propriétés visuelles comme la forme des symboles des nœuds : celles-ci sont impossibles à distinguer dans les grandes cartes graphiques. En fait, lors du dessin de très grands réseaux, nous pouvons même vouloir masquer les bords du réseau et nous concentrer sur l’identification et la visualisation des communautés de nœuds.
À ce stade, la taille des réseaux que vous pouvez visualiser dans R est principalement limitée par la RAM de votre machine. Une chose à souligner cependant est que dans de nombreux cas, visualiser des réseaux plus vastes sous forme de boules de poils géantes est moins utile que de fournir des graphiques qui montrent les principales caractéristiques du graphique.
Le premier ensemble de données avec lequel nous allons travailler se compose de deux fichiers, “Dataset1-Media-Example-NODES.csv” et “Dataset1-Media-Example-EDGES.csv”
nodes <- read.csv("C:/Users/Lazar/Desktop/CARDES/Dataset1-Media-Example-NODES.csv", header=T, as.is=T)
links <- read.csv("C:/Users/Lazar/Desktop/CARDES/Dataset1-Media-Example-EDGES.csv", header=T, as.is=T)
Examinez les données :
head(nodes)
head(links)
Ensuite, nous allons convertir les données brutes en un objet réseau igraph . Pour ce faire, nous allons utiliser la graph_from_data_frame()fonction, qui prend deux data frames : det vertices.
-d décrit les bords du réseau. Ses deux premières colonnes sont les ID du nœud source et du nœud cible pour chaque arête. Les colonnes suivantes sont des attributs d’arête (poids, type, étiquette ou autre).
-sommets commence par une colonne d’ID de nœuds. Toutes les colonnes suivantes sont interprétées comme des attributs de nœud.
library('igraph')
## Warning: package 'igraph' was built under R version 4.2.3
##
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
##
## decompose, spectrum
## The following object is masked from 'package:base':
##
## union
net <- graph_from_data_frame(d=links, vertices=nodes, directed=T)
net
## IGRAPH f79146c DNW- 17 49 --
## + attr: name (v/c), media (v/c), media.type (v/n), type.label (v/c),
## | audience.size (v/n), type (e/c), weight (e/n)
## + edges from f79146c (vertex names):
## [1] s01->s02 s01->s03 s01->s04 s01->s15 s02->s01 s02->s03 s02->s09 s02->s10
## [9] s03->s01 s03->s04 s03->s05 s03->s08 s03->s10 s03->s11 s03->s12 s04->s03
## [17] s04->s06 s04->s11 s04->s12 s04->s17 s05->s01 s05->s02 s05->s09 s05->s15
## [25] s06->s06 s06->s16 s06->s17 s07->s03 s07->s08 s07->s10 s07->s14 s08->s03
## [33] s08->s07 s08->s09 s09->s10 s10->s03 s12->s06 s12->s13 s12->s14 s13->s12
## [41] s13->s17 s14->s11 s14->s13 s15->s01 s15->s04 s15->s06 s16->s06 s16->s17
## [49] s17->s04
La description d’un objet igraph commence par quatre lettres :
1 D ou U, pour un graphe orienté ou non orienté 2 N pour un graphe nommé (où les nœuds ont un nameattribut) 3 W pour un graphe pondéré (où les arêtes ont un weightattribut) 4 B pour un graphe bipartite (à deux modes) (où les nœuds ont un typeattribut)
Les deux nombres qui suivent (17 49) font référence au nombre de nœuds et d’arêtes dans le graphe. La description répertorie également les attributs de nœud et de bord, par exemple :
E(net) #e bord de l'objectif net
## + 49/49 edges from f79146c (vertex names):
## [1] s01->s02 s01->s03 s01->s04 s01->s15 s02->s01 s02->s03 s02->s09 s02->s10
## [9] s03->s01 s03->s04 s03->s05 s03->s08 s03->s10 s03->s11 s03->s12 s04->s03
## [17] s04->s06 s04->s11 s04->s12 s04->s17 s05->s01 s05->s02 s05->s09 s05->s15
## [25] s06->s06 s06->s16 s06->s17 s07->s03 s07->s08 s07->s10 s07->s14 s08->s03
## [33] s08->s07 s08->s09 s09->s10 s10->s03 s12->s06 s12->s13 s12->s14 s13->s12
## [41] s13->s17 s14->s11 s14->s13 s15->s01 s15->s04 s15->s06 s16->s06 s16->s17
## [49] s17->s04
V(net) # la verticale de l'objet net
## + 17/17 vertices, named, from f79146c:
## [1] s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17
E(net)$type # type d'attribut de bord
## [1] "hyperlink" "hyperlink" "hyperlink" "mention" "hyperlink" "hyperlink"
## [7] "hyperlink" "hyperlink" "hyperlink" "hyperlink" "hyperlink" "hyperlink"
## [13] "mention" "hyperlink" "hyperlink" "hyperlink" "mention" "mention"
## [19] "hyperlink" "mention" "mention" "hyperlink" "hyperlink" "mention"
## [25] "hyperlink" "hyperlink" "mention" "mention" "mention" "hyperlink"
## [31] "mention" "hyperlink" "mention" "mention" "mention" "hyperlink"
## [37] "mention" "hyperlink" "mention" "hyperlink" "mention" "mention"
## [43] "mention" "hyperlink" "hyperlink" "hyperlink" "hyperlink" "mention"
## [49] "hyperlink"
V(net)$media #sommet media d'attribut
## [1] "NY Times" "Washington Post" "Wall Street Journal"
## [4] "USA Today" "LA Times" "New York Post"
## [7] "CNN" "MSNBC" "FOX News"
## [10] "ABC" "BBC" "Yahoo News"
## [13] "Google News" "Reuters.com" "NYTimes.com"
## [16] "WashingtonPost.com" "AOL.com"
# Rechercher des nœuds et des arêtes par attribut :
# (qui renvoie des objets de type séquence de sommets/séquence d'arêtes)
V(net)[media=="BBC"]
## + 1/17 vertex, named, from f79146c:
## [1] s11
E(net)[type=="mention"]
## + 20/49 edges from f79146c (vertex names):
## [1] s01->s15 s03->s10 s04->s06 s04->s11 s04->s17 s05->s01 s05->s15 s06->s17
## [9] s07->s03 s07->s08 s07->s14 s08->s07 s08->s09 s09->s10 s12->s06 s12->s14
## [17] s13->s17 s14->s11 s14->s13 s16->s17
# ous pouvez également examiner directement la matrice réseau :
net[1,]
## s01 s02 s03 s04 s05 s06 s07 s08 s09 s10 s11 s12 s13 s14 s15 s16 s17
## 0 22 22 21 0 0 0 0 0 0 0 0 0 0 20 0 0
net[5,7]
## [1] 0
Il est également facile d’extraire une liste d’arêtes ou une matrice du igraphréseau :
# Obtenez une liste d'arêtes ou une matrice :
as_edgelist(net, names=T)
## [,1] [,2]
## [1,] "s01" "s02"
## [2,] "s01" "s03"
## [3,] "s01" "s04"
## [4,] "s01" "s15"
## [5,] "s02" "s01"
## [6,] "s02" "s03"
## [7,] "s02" "s09"
## [8,] "s02" "s10"
## [9,] "s03" "s01"
## [10,] "s03" "s04"
## [11,] "s03" "s05"
## [12,] "s03" "s08"
## [13,] "s03" "s10"
## [14,] "s03" "s11"
## [15,] "s03" "s12"
## [16,] "s04" "s03"
## [17,] "s04" "s06"
## [18,] "s04" "s11"
## [19,] "s04" "s12"
## [20,] "s04" "s17"
## [21,] "s05" "s01"
## [22,] "s05" "s02"
## [23,] "s05" "s09"
## [24,] "s05" "s15"
## [25,] "s06" "s06"
## [26,] "s06" "s16"
## [27,] "s06" "s17"
## [28,] "s07" "s03"
## [29,] "s07" "s08"
## [30,] "s07" "s10"
## [31,] "s07" "s14"
## [32,] "s08" "s03"
## [33,] "s08" "s07"
## [34,] "s08" "s09"
## [35,] "s09" "s10"
## [36,] "s10" "s03"
## [37,] "s12" "s06"
## [38,] "s12" "s13"
## [39,] "s12" "s14"
## [40,] "s13" "s12"
## [41,] "s13" "s17"
## [42,] "s14" "s11"
## [43,] "s14" "s13"
## [44,] "s15" "s01"
## [45,] "s15" "s04"
## [46,] "s15" "s06"
## [47,] "s16" "s06"
## [48,] "s16" "s17"
## [49,] "s17" "s04"
as_adjacency_matrix(net, attr="weight")
## 17 x 17 sparse Matrix of class "dgCMatrix"
## [[ suppressing 17 column names 's01', 's02', 's03' ... ]]
##
## s01 . 22 22 21 . . . . . . . . . . 20 . .
## s02 23 . 21 . . . . . 1 5 . . . . . . .
## s03 21 . . 22 1 . . 4 . 2 1 1 . . . . .
## s04 . . 23 . . 1 . . . . 22 3 . . . . 2
## s05 1 21 . . . . . . 2 . . . . . 21 . .
## s06 . . . . . 1 . . . . . . . . . 21 21
## s07 . . 1 . . . . 22 . 21 . . . 4 . . .
## s08 . . 2 . . . 21 . 23 . . . . . . . .
## s09 . . . . . . . . . 21 . . . . . . .
## s10 . . 2 . . . . . . . . . . . . . .
## s11 . . . . . . . . . . . . . . . . .
## s12 . . . . . 2 . . . . . . 22 22 . . .
## s13 . . . . . . . . . . . 21 . . . . 1
## s14 . . . . . . . . . . 1 . 21 . . . .
## s15 22 . . 1 . 4 . . . . . . . . . . .
## s16 . . . . . 23 . . . . . . . . . . 21
## s17 . . . 4 . . . . . . . . . . . . .
# Ou des trames de données décrivant les nœuds et les arêtes :
as_data_frame(net, what="edges")
as_data_frame(net, what="vertices")
Maintenant que nous avons notre objet réseau igraph, faisons une première tentative pour le tracer.
plot(net)
Ça n’a pas l’air très bon. Commençons par réparer les choses en supprimant les boucles du graphique.
net <- simplify(net, remove.multiple = F, remove.loops = T)
Nous pourrions également utiliser simplifypour combiner plusieurs arêtes en additionnant leurs poids avec une commande comme simplify(net, edge.attr.comb=list(Weight=“sum”,“ignore”)). Notez cependant que cela combinerait également plusieurs types d’arêtes (dans nos données : “hyperliens” et “mentions”).
Réduisons la taille de la flèche et supprimons les étiquettes (nous le faisons en les définissant sur NA):
plot(net, edge.arrow.size=.4,vertex.label=NA)
racé avec igraph: les tracés du réseau ont un large éventail de paramètres que vous pouvez définir. Celles-ci incluent les options de nœud (commençant par vertex.) et les options de bord (commençant par edge.). Une liste des options sélectionnées est incluse ci-dessous, mais vous pouvez également consulter ?igraph.plottingpour plus d’information.
Nous pouvons définir les options node & edge de deux manières - la première consiste à les spécifier dans la plot()fonction, comme nous le faisons ci-dessous.
plot(net, edge.arrow.size=.4, edge.curved=.1)
plot(net, edge.arrow.size=.2, edge.color="orange",
vertex.color="orange", vertex.frame.color="#ffffff",
vertex.label=V(net)$media, vertex.label.color="black")
La deuxième façon de définir des attributs consiste à les ajouter à l’ igraphobjet. Disons que nous voulons colorer nos nœuds de réseau en fonction du type de média et les dimensionner en fonction du degré de centralité (plus de liens -> nœud plus grand). Nous modifierons également la largeur des bords en fonction de leur poids.
#Générer des couleurs en fonction du type de média :
colrs <- c("gray50", "tomato", "gold")
V(net)$color <- colrs[V(net)$media.type]
# Calculez les degrés de nœud (#links) et utilisez-les pour définir la taille du nœud :
deg <- degree(net, mode="all")
V(net)$size <- deg*3
# Nous pourrions également utiliser la valeur de la taille de l'audience :
V(net)$size <- V(net)$audience.size*0.6
# Les étiquettes sont actuellement des ID de nœud.
# Les définir sur NA n'affichera aucune étiquette :
V(net)$label <- NA
# Définir la largeur du bord en fonction du poids :
E(net)$width <- E(net)$weight/6
#modifier la taille de la flèche et la couleur du bord :
E(net)$arrow.size <- .2
E(net)$edge.color <- "gray80"
# Nous pouvons même définir la disposition du réseau :
graph_attr(net, "layout") <- layout_with_lgl
plot(net)
Nous pouvons également remplacer les attributs explicitement dans le tracé :
plot(net, edge.color="orange", vertex.color="gray50")
Il est utile d’ajouter une légende expliquant la signification des couleurs que nous avons utilisées :
plot(net)
legend(x=-1.5, y=-1.1, c("Newspaper","Television", "Online News"), pch=21,
col="#777777", pt.bg=colrs, pt.cex=2, cex=.8, bty="n", ncol=1)
Parfois, notamment avec les réseaux sémantiques, on peut être intéressé à ne tracer que les étiquettes des nœuds :
plot(net, vertex.shape="none", vertex.label=V(net)$media,
vertex.label.font=2, vertex.label.color="gray40",
vertex.label.cex=.7, edge.color="gray85")
Colorons les bords du graphique en fonction de la couleur de leur nœud source. Nous pouvons obtenir le nœud de départ pour chaque arête avec la ends()fonction igraph. Il renvoie les sommets de début et de fin pour les arêtes répertoriées dans le esparamètre. Le namesparamètre contrôle si la fonction renvoie des noms ou des ID d’arêtes.
edge.start <- ends(net, es=E(net), names=F)[,1]
edge.col <- V(net)$color[edge.start]
plot(net, edge.color=edge.col, edge.curved=.1)
layouts <- grep("^layout_", ls("package:igraph"), value=TRUE)[-1]
# Remove layouts that do not apply to our graph.
layouts <- layouts[!grepl("bipartite|merge|norm|sugiyama|tree", layouts)]
par(mfrow=c(3,3), mar=c(1,1,1,1))
for (layout in layouts) {
print(layout)
l <- do.call(layout, list(net))
plot(net, edge.arrow.mode=0, layout=l, main=layout) }
## [1] "layout_as_star"
## [1] "layout_components"
## [1] "layout_in_circle"
## [1] "layout_nicely"
## [1] "layout_on_grid"
## [1] "layout_on_sphere"
## [1] "layout_randomly"
## [1] "layout_with_dh"
## [1] "layout_with_drl"
## [1] "layout_with_fr"
## [1] "layout_with_gem"
## [1] "layout_with_graphopt"
## [1] "layout_with_kk"
## [1] "layout_with_lgl"
## [1] "layout_with_mds"
R et igraph permettent le traçage interactif des réseaux. Cela peut être une option utile pour vous si vous souhaitez modifier légèrement la disposition d’un petit graphique. Après avoir ajusté la disposition manuellement, vous pouvez obtenir les coordonnées des nœuds et les utiliser pour d’autres parcelles.
tkid <- tkplot(net)
l <- tkplot.getcoords(tkid)
plot(net, layout=l)