Visualisation circulaire dans R

1.2 Un coup d’œil rapide

Avant d’aller trop loin dans les détails, je montre d’abord un exemple simple avec l’utilisation des fonctionnalités de base dans le package circlize pour vous aider à avoir une idée de base du fonctionnement du package.

Générons d’abord des données aléatoires. Il faut un vecteur de caractères pourprésenter des catégories, un vecteur numérique de valeurs x et un vecteur de valeurs y.

set.seed(999)n = 1000df = data.frame(sectors = sample(letters, n, replace = TRUE), x = rnorm(n), y = runif(n))

Nous initialisons d’abord la disposition circulaire. Le cercle est divisé en secteursbasé sur la plage de données sur les axes X de chaque catégorie. Dans le code suivant, df$x est divisé par df$sectors et la largeur des secteurs est automatiquement calculée en fonction des plages de données de chaque catégorie. Par défaut, les secteurs sont positionnés à partir de \(\thêta = 0\) (dans le système de coordonnées polaires) et suivent judicieusement le cercle. Vous ne verrez peut-être rien après avoir exécuté le code suivant car notrack a encore été ajouté.

library(circlize)circos.par("track.height" = 0.1)circos.initialize(df$sectors, x = df$x)

Nous définissons un paramètre global track.height sur 0.1 par l’option function circis.par() pour que toutes les pistes qui seront ajoutées aient une hauteur par défaut de0.1. Le cercle utilisé par circlize a toujours un rayon de 1, donc une hauteur de 0,1 signifie 10% du rayon du cercle. Dans les chapitres suivants, vous trouverez comment régler la hauteur avec des unités physiques, par exemple cm.

Notez que l’allocation des secteurs n’a besoin que de valeurs sur la direction x (ou sur la direction circulaire), les valeurs sur la direction y (direction radicale) seront utilisées à l’étape de création de pistes.

Une fois la mise en page circulaire initialisée, des graphiques peuvent être ajoutés au tracé de manière piste par piste. Avant de dessiner quoi que ce soit, nous devons savoir que alltracks doit d’abord être créé par circos.trackPlotRegion() ou, pour faire court, circos.track(), puis les fonctions de bas niveau peuvent être ajoutées par la suite. Pensez juste dans le moteur graphique de base R, vous devez d’abord appeler plot() puis vous pouvez utiliser des fonctions telles que points() et lines() pour ajouter des graphiques. Étant donné que les plages x pour les cellules de la piste ont déjà été définies à l’étape d’initialisation, il suffit ici de spécifier la plage y pour chaque cellule. Les plages y peuvent être spécifiées par l’argument y en tant que vecteur numérique (de sorte que la plage y sera extraite et calculée de manière esthétique dans chaque cellule) ou par l’argument ylim en tant qu’avecteur de longueur deux. En principe, les plages y doivent être les mêmes pour toutes les cellules de la piste asame. (Voir Figure 1.2)

circos.track(df$sectors, y = df$y, panel.fun = function(x, y) { circos.text(CELL_META$xcenter, CELL_META$cell.ylim + mm_y(5), CELL_META$sector.index) circos.axis(labels.cex = 0.6)})col = rep(c("#FF0000", "#00FF00"), 4)circos.trackPoints(df$sectors, df$x, df$y, col = col, pch = 16, cex = 0.5)circos.text(-1, 0.5, "text", sector.index = "a", track.index = 1)
 Premier exemple de circlize, ajoutez la première piste.

Figure 1.2 : Premier exemple de circlize, ajoutez la première piste.

Les axes du tracé circulaire sont normalement tracés le plus à l’extérieur du cercle. Ici, nous ajoutons des axes dans la première piste en mettant circos.axis() à l’intérieurla fonction auto-définie panel.fun (voir le code ci-dessus). circos.track() crée une région de traçage d’une manière cellule par cellule et la panel.fun est effectivement exécutée immédiatement après la région de traçage pour une certaine cellule est créée. Ainsi, panel.fun signifie en fait ajouter des graphiques dans la « currentcell » (L’utilisation de panel.fun est discutée plus en détail dans la section 2.7).Sans spécifier d’arguments, circos.axis() dessine des axes x sur le haut de chaque cellule (ou l’extérieur de chaque cellule).

De plus, nous ajoutons le nom du secteur en dehors de la première piste en utilisant circos.text().CELL_META fournit des « méta-informations » pour la cellule actuelle. Il existe plusieurs paramètres qui peuvent être récupérés par CELL_META. Toute son utilisation est expliquée dans la section 2.7. Dans le code ci-dessus, les noms de secteur sont dessinés en dehors des cellules et vous pouvez voir des messages d’avertissement indiquant des points de données dépassant les régions de traçage. C’est très bien et pas de souci à ce sujet. Vous pouvez également ajouter des noms de secteur en créant une piste vide sans frontières en tant que première piste et y ajouter des noms de secteur (comme ce que font circos.initializeWithIdeogram() et chordDiagram(), après avoir parcouru les chapitres suivants).

Lorsque vous spécifiez la position du texte dans la direction y, un décalage de mm_y(5) (5 mm) est ajouté à la position y du texte. Dans circos.text(), les valeurs x et y sont mesurées dans la coordonnée de données (la coordonnée dans la cellule), et certaines fonctions auxiliaires convertissent les unités absolues en valeurs correspondantes dans la coordonnée de données. La Section2.8.2 fournit plus d’informations sur la conversion des unités de coordonnées indifférentes.

Une fois la piste créée, des points sont ajoutés à la première piste par circos.trackPoints(). circos.trackPoints() ajoute simplement des points dans toutes les cellules simultanément. Comme expliqué plus en détail à la section 3.2, il peut être remplacé en mettant circos.text() dans panel.fun, cependant, circos.trackPoints() serait plus pratique si seuls les points sont nécessaires pour mettre dans les cellules (mais je ne recommande pas vraiment). Il est assez simple de comprendre que cette fonction nécessite une variable catégorielle (df$sectors), des valeurs sur la direction x et la direction y (df$x et df$y).

Des fonctions de bas niveau telles que circos.text() peuvent également être utilisées en dehors de panel.fun comme indiqué dans le code ci-dessus. Si c’est le cas, sector.index et track.index doivent être spécifiés explicitement car le secteur « actuel » et la piste « actuelle » peuvent ne pas être ce que vous voulez. Si les graphiques sont directement ajoutés à la piste la plus récemment créée, track.index peut être omis car cette piste est juste marquée comme la piste « actuelle ».

OK, maintenant nous ajoutons des histogrammes à la deuxième piste. Ici circos.trackHist() est une fonction de haut niveau, ce qui signifie qu’elle crée une nouvelle piste (comme vous pouvez l’imaginer hist() est également une fonction de haut niveau). bin.size est explicitement défini de manière à ce que la taille bin des histogrammes dans toutes les cellules soit la même et puisse être comparée l’une à l’autre. (Voir Figure 1.3)

bgcol = rep(c("#EFEFEF", "#CCCCCC"), 4)circos.trackHist(df$sectors, df$x, bin.size = 0.2, bg.col = bgcol, col = NA)
 Premier exemple de circlize, ajoutez la deuxième piste.

Figure 1.3: Premier exemple de circlize, ajoutez la deuxième piste.

Dans la troisième piste et dans panel.fun, nous avons choisi au hasard 10 points de données dans chaque cellule, les trions par valeurs x et les connectons avec des lignes. Dans followingcode, lorsque sectors (le premier argument sans nom), les arguments x et y sont définis dans circos.track(), les valeurs x et les valeurs y sont divisées par df$sectors et un sous-ensemble correspondant de valeurs x et y est envoyé à panel.fun via les arguments x et y de panel.fun. Ainsi, x et y dans panel.fun sontexactement les valeurs de la cellule « actuelle ». (Voir Figure1.4)

circos.track(df$sectors, x = df$x, y = df$y, panel.fun = function(x, y) { ind = sample(length(x), 10) x2 = x y2 = y od = order(x2) circos.lines(x2, y2)})
 Premier exemple de circlize, ajoutez la troisième piste.

Figure 1.4 : Premier exemple de circlize, ajoutez la troisième piste.

Maintenant, nous revenons à la deuxième piste et mettons à jour la cellule dans le secteur « d ».Ceci est fait par circos.updatePlotRegion() ou la version courte circos.update(). La fonction efface les graphiques qui ont été ajoutés.circos.update() ne peut pas modifier les xlim et ylim de la cellule ainsi que d’autres paramètres liés à la position de la cellule. circos.update() doit spécifier explicitement l’index de secteur et l’index de suivi, sauf si la cellule « actuelle » est celle que vous souhaitez mettre à jour. Après l’appel de circos.update(), la cellule « actuelle » est redirigée vers la cellule que vous venez de spécifier et vous pouvez utiliser des fonctions graphiques de bas niveau pour y ajouter des graphiques directement.(Voir Figure 1.5)

circos.update(sector.index = "d", track.index = 2, bg.col = "#FF8080", bg.border = "black")circos.points(x = -2:2, y = rep(0.5, 5), col = "white")circos.text(CELL_META$xcenter, CELL_META$ycenter, "updated", col = "white")
 Premier exemple de circlize, mettez à jour la deuxième piste.

Figure 1.5 : Premier exemple de circlize, mise à jour de la deuxième piste.

Ensuite, nous continuons à créer de nouvelles pistes. Bien que nous soyons revenus à la deuxième piste, lors de la création d’une nouvelle piste, la nouvelle piste est toujours créée après la piste qui est la plus à l’intérieur. Dans cette nouvelle piste, nous ajoutons des cartes thermiques par circos.rect(). Notez ici que nous n’avons pas défini les données d’entrée, tout en définissant simplement l’argument ylim car les cartes thermiques remplissent simplement la cellule entière de la gauche à la droite et de bas en haut. De plus, la valeur exacte de ylim n’est pas importante et x, y dans panel.fun() ne sont pas utilisés (en fait, ils sont tous les deux NULL). (Voir Figure 1.6)

circos.track(ylim = c(0, 1), panel.fun = function(x, y) { xlim = CELL_META$xlim ylim = CELL_META$ylim breaks = seq(xlim, xlim, by = 0.1) n_breaks = length(breaks) circos.rect(breaks, rep(ylim, n_breaks - 1), breaks, rep(ylim, n_breaks - 1), col = rand_color(n_breaks), border = NA)})
 Premier exemple de circlize, ajoutez la quatrième piste.

Figure 1.6 : Premier exemple de circlize, ajoutez la quatrième piste.

Au plus à l’intérieur du cercle, des liens ou des rubans sont ajoutés. Il peut y avoir des liens d’un point à un point, d’un point à un intervalle ou d’un intervalle à un intervalle. La section 3.11 donne une utilisation détaillée des liens. (Voir Figure 1.7)

circos.link("a", 0, "b", 0, h = 0.4)circos.link("c", c(-0.5, 0.5), "d", c(-0.5,0.5), col = "red", border = "blue", h = 0.2)circos.link("e", 0, "g", c(-1,1), col = "green", border = "black", lwd = 2, lty = 2)
 Premier exemple de circlize, ajoutez des liens.

Figure 1.7 : Premier exemple de circlize, ajout de liens.

Enfin, nous devons réinitialiser les paramètres graphiques et les variables internes, de sorte que cela ne gâchera pas votre prochain tracé.

circos.clear()

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.