1.2 A quick glance
Prima di andare troppo in profondità nei dettagli, prima di dimostrare un semplice examplewith utilizzando le funzionalità di base in circlize pacchetto per aiutarvi a geta idea di base di come funziona il pacchetto.
Per prima cosa generiamo alcuni dati casuali. C’è bisogno di un vettore di caratteri per rappresentare le categorie, un vettore numerico di valori x e un vectoe di valori y.
set.seed(999)n = 1000df = data.frame(sectors = sample(letters, n, replace = TRUE), x = rnorm(n), y = runif(n))
Per prima cosa inizializziamo il layout circolare. Il cerchio è diviso in settoribasato sull’intervallo di dati sugli assi x in ogni categoria. Nel seguente codice, df$x
è diviso per df$sectors
e la larghezza dei settori viene calcolata automaticamente in base agli intervalli di dati in ciascuna categoria. Essere predefinito, i settori sono posizionatiavviato da \(\theta = 0\) (nel sistema di coordinate polari) e andare lungo il circleclock-saggiamente. Potresti non vedere nulla dopo aver eseguito il codice seguente perché notrack è stato ancora aggiunto.
library(circlize)circos.par("track.height" = 0.1)circos.initialize(df$sectors, x = df$x)
Impostiamo un parametro globale track.height
su 0.1 con la funzione di opzionecircis.par()
in modo che tutte le tracce che verranno aggiunte abbiano un’altezza predefinita di0.1. Il cerchio utilizzato da circlize ha sempre un raggio di 1, quindi un’altezza di 0,1 significa il 10% del raggio del cerchio. Nei capitoli successivi, puoi trovare come impostare l’altezza con unità fisiche, ad esempio cm.
Si noti che l’assegnazione dei settori richiede solo valori sulla direzione x (osulla direzione circolare), verranno utilizzati i valori sulla direzione y (direzione radicale) nella fase di creazione delle tracce.
Dopo l’inizializzazione del layout circolare, è possibile aggiungere grafica alla trama in un modo track-by-track. Prima di disegnare qualsiasi cosa, dobbiamo sapere che alltracks dovrebbe essere prima creato da circos.trackPlotRegion()
o, in breve,circos.track()
, quindi le funzioni di basso livello possono essere aggiunte in seguito. Justthink nel motore grafico di base R, è necessario prima chiamare plot()
quindi è possibile utilizzare funzioni come points()
e lines()
per aggiungere grafica. Poiché gli intervalli x per le celle nella traccia sono già stati definiti nella fase di inizializzazione, qui abbiamo solo bisogno di specificare l’intervallo y per ogni cella. Gli intervalli y possono essere specificati dall’argomento y
come vettore numerico (in modo che l’intervallo y venga estratto e calcolato beautomatically in ogni cella) o dall’argomento ylim
come avector di lunghezza due. In linea di principio, gli intervalli y dovrebbero essere uguali per tutte le celle in asame track. (Vedi Figura 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)
Figura 1.2: Primo esempio di circlize, aggiungere la prima traccia.
Gli assi per la trama circolare sono normalmente disegnati al di fuori del cerchio. Qui aggiungiamo assi nella prima traccia mettendo circos.axis()
all’internola funzione auto-definita panel.fun
(vedi il codice sopra). circos.track()
crea la regione di stampa in modo cella per cella e panel.fun
viene effettivamente eseguito immediatamente dopo che la regione di stampa per una determinata cella è stata creata. Quindi, panel.fun
significa effettivamente aggiungere grafica in “currentcell” (l’uso di panel.fun
è ulteriormente discusso nella Sezione 2.7).Senza specificare alcun argomento, circos.axis()
disegna x-axesulla parte superiore di ogni cella (o all’esterno di ogni cella).
Inoltre, aggiungiamo il nome del settore al di fuori della prima traccia utilizzando circos.text()
.CELL_META
fornisce “meta informazioni” per la cella corrente. Ci sonodiversi parametri che possono essere recuperati da CELL_META
. Tutto il suo utilizzo è spiegato nella Sezione 2.7. Nel codice sopra, i nomi del settore sono disegnati al di fuori delle celle e potresti vedere messaggi di avviso che dicono punti dati che superano le regioni di stampa. Che è totale bene e nessuna preoccupazione su di esso. Youcan anche aggiungono nomi di settore creando una pista vuota senza confini come thefirst traccia e aggiungono nomi di settore in lui (come quello che circos.initializeWithIdeogram()
e chordDiagram()
fanno, dopo che Lei passa capitoli di throughfollowing).
Quando si specifica la posizione del testo sulla direzione y, viene aggiunto un offset dimm_y(5)
(5mm) alla posizione y del testo. In circos.text()
, x e yvalues sono misurati nella coordinata di dati (la coordinata in cella), e thereare alcune funzioni di aiuto che convertono unità assolute a valori corrispondenti in coordinate di dati. La sezione2.8. 2 fornisce maggiori informazioni sulla conversione delle unitàdiverse coordinate.
Dopo aver creato la traccia, i punti vengono aggiunti alla prima traccia dacircos.trackPoints()
. circos.trackPoints()
aggiunge semplicemente punti in tutte le celle contemporaneamente. Come ulteriormente spiegato nella Sezione 3.2, può essere sostituito mettendo circos.text()
in panel.fun
, tuttavia,circos.trackPoints()
sarebbe più conveniente se solo i punti sono necessari per inserire le celle (ma non lo consiglio davvero). È abbastanza semplice capire che questofunzione ha bisogno di una variabile categoriale (df$sectors
), valori su direzione x e direzione y (df$x
e df$y
).
Funzioni di basso livello come circos.text()
possono essere utilizzate anche all’esternopanel.fun
come mostrato nel codice precedente. In tal caso, sector.index
e track.index
devono essere specificati esplicitamente perché il settore “corrente” e la traccia “corrente”potrebbero non essere ciò che si desidera. Se la grafica viene aggiunta direttamente alla traccia creata più di recente, track.index
può essere omessa perché questa traccia è contrassegnata come traccia “corrente”.
OK, ora aggiungiamo istogrammi alla seconda traccia. Qui circos.trackHist()
è una funzione di alto livello che significa che crea una nuova traccia (come puoi immaginare hist()
è anche una funzione di alto livello). bin.size
è impostato esplicitamente in modo che il binsize per gli istogrammi in tutte le celle sia lo stesso e possa essere confrontato l’uno con l’altro. (Vedi Figura 1.3)
bgcol = rep(c("#EFEFEF", "#CCCCCC"), 4)circos.trackHist(df$sectors, df$x, bin.size = 0.2, bg.col = bgcol, col = NA)
Figura 1.3: Primo esempio di circlize, aggiungere la seconda traccia.
Nella terza traccia e in panel.fun
, abbiamo scelto casualmente 10 punti dati inogni cella, ordinarli per valori x e collegarli con le linee. In followingcode, quando sectors
(il primo argomento senza nome), x
e y
gli argomenti sono impostati incircos.track()
, i valori x e i valori y sono divisi per df$sectors
e il sottoinsieme corrispondente di valori x e y viene inviato agli argomenti panel.fun
attraversopanel.fun
x
e y
. Quindi, x
un y
in panel.fun
sono esattamente i valori nella cella “corrente”. (Cfr. figura 1.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)})
Figura 1.4: Primo esempio di circlize, aggiungere la terza traccia.
Ora torniamo alla seconda traccia e aggiorniamo la cella nel settore “d”.Questo viene fatto da circos.updatePlotRegion()
o dalla versione brevecircos.update()
. La funzione cancella la grafica che sono stati aggiunti.circos.update()
non è possibile modificare il xlim
e ylim
della cella, nonché altre impostazioni relative alla posizione della cella. circos.update()
necessitàspecificare esplicitamente l’indice di settore e tenere traccia dell’indice a meno che la cella “corrente” non sia ciò che si desidera aggiornare. Dopo la chiamata di circos.update()
, la cella” corrente ” viene reindirizzata alla cella che hai appena specificato e puoi utilizzare funzioni grafiche di basso livello per aggiungere grafica direttamente in essa.(Vedi Figura 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")
Figura 1.5: Primo esempio di circlize, aggiornare la seconda traccia.
Successivamente continuiamo a creare nuove tracce. Anche se siamo tornati alla seconda traccia, quando si crea una nuova traccia, la nuova traccia viene ancora creata dopo la traccia che è più all’interno. In questa nuova traccia, aggiungiamo heatmap dicircos.rect()
. Nota qui non abbiamo impostato i dati di input, mentre è sufficiente impostare l’argomentoylim
perché le heatmap riempiono l’intera cella da sinistra a destra e dal basso verso l’alto. Anche il valore esatto di ylim
non èimportante e x
, y
in panel.fun()
non vengono utilizzati (in realtà sono entrambiNULL
). (Vedi Figura 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)})
Figura 1.6: Primo esempio di circlize, aggiungere la quarta traccia.
Nella parte più interna del cerchio vengono aggiunti collegamenti o nastri. Ci possono essere linksfrom singolo punto a punto, punto a intervallo o intervallo a intervallo. La sezione 3.11 fornisce un utilizzo dettagliato dei collegamenti. (Vedi Figura 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)
Figura 1.7: Primo esempio di circlize, aggiungi collegamenti.
Infine dobbiamo ripristinare i parametri grafici e le variabili interne, quindiche non rovinerà la tua prossima trama.
circos.clear()