1.2 szybki rzut oka
zanim przejdziemy zbyt głęboko w szczegóły, najpierw zademonstruję prosty przykładz wykorzystaniem podstawowych funkcji w pakiecie circlize, aby pomóc ci uzyskać podstawowe pojęcie o tym, jak działa pakiet.
najpierw wygenerujmy losowe DANE. Potrzebny jest wektor znakowy dla kategorii, wektor liczbowy wartości x i Wektor wartości y.
set.seed(999)n = 1000df = data.frame(sectors = sample(letters, n, replace = TRUE), x = rnorm(n), y = runif(n))
najpierw inicjalizujemy układ kołowy. Okrąg jest podzielony na sektory na podstawie zakresu danych na osiach x w każdej kategorii. W poniższym kodzie df$x
jest dzielona przez df$sectors
, a szerokość sektorów jest automatycznie obliczana na podstawie zakresów danych w każdej kategorii. Domyślnie, sektory są pozycjonowane od \(\theta = 0\) (w układzie współrzędnych biegunowych) i idą wzdłuż okręgu-mądrze. Możesz nie zobaczyć niczego po uruchomieniu następującego kodu, ponieważ notrack został jeszcze dodany.
library(circlize)circos.par("track.height" = 0.1)circos.initialize(df$sectors, x = df$x)
ustawiamy globalny parametr track.height
na 0.1 za pomocą funkcji option circis.par()
, aby wszystkie ścieżki, które zostaną dodane, miały domyślną wysokość 0,1. Okrąg używany przez circlize ma zawsze promień 1, więc wysokość 0,1 oznacza 10% promienia okręgu. W późniejszych rozdziałach można znaleźć sposób ustawiania wysokości za pomocą jednostek fizycznych, np. cm.
zauważ, że alokacja sektorów wymaga tylko wartości na kierunku x (lub na kierunku kołowym), wartości na kierunku y (kierunek radykalny) zostaną użyte w kroku tworzenia ścieżek.
po zainicjowaniu układu kołowego można dodać grafikę do wykresu w sposób śledzenia po ścieżce. Przed rysowaniem czegokolwiek, musimy wiedzieć, że alltracks powinny być najpierw utworzone przez circos.trackPlotRegion()
lub, w skrócie,circos.track()
, a następnie funkcje niskiego poziomu mogą być dodane później. Wystarczy pomyśleć w podstawowym silniku graficznym r, że najpierw zadzwoń plot()
, a następnie możesz użyć funkcji takich jak points()
i lines()
, aby dodać grafikę. Ponieważ x-rangesdla komórek w ścieżce zostały już zdefiniowane w kroku inicjalizacji, tutaj musimy tylko określić zakres y dla każdej komórki. Zakresy y mogą być określone przez y
argument jako wektor liczbowy (tak, że zakres y będzie beautomatycznie wyodrębniony i obliczony w każdej komórce) lub ylim
argument jako avector długości dwóch. Zasadniczo zakresy y powinny być takie same dla wszystkich komórek w ścieżce asame. (Patrz rysunek 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)
rysunek 1.2: pierwszy przykład zakreślenia, dodaj pierwszy utwór.
osie dla wykresu kołowego są zwykle rysowane na najbardziej zewnętrznej stronie koła. Tutaj dodajemy osie w pierwszej ścieżce, umieszczając circos.axis()
wewnątrz własnej funkcji panel.fun
(patrz kod powyżej). circos.track()
tworzy region wykreślania w sposób komórka po komórce, a panel.fun
jest wykonywany natychmiast po utworzeniu regionu wykreślania dla określonej komórki. Tak więc panel.fun
faktycznie oznacza dodawanie grafiki w „currentcell” (użycie panel.fun
jest dalej omówione w sekcji 2.7).Nie podając żadnych argumentów, circos.axis()
rysuje x-Axes na górze każdej komórki (lub na zewnątrz każdej komórki).
dodajemy również nazwę sektora poza pierwszą ścieżką, używając circos.text()
.CELL_META
dostarcza „meta informacje” dla bieżącej komórki. Istnieje kilka parametrów, które można pobrać za pomocą CELL_META
. Całe jego użycie zostało wyjaśnione w punkcie 2.7. W powyższym kodzie nazwy sektorów są wyświetlane poza komórkami i mogą pojawić się komunikaty ostrzegawcze mówiące o punktach danych oznaczających regiony wykreślenia. To jest całkowicie w porządku i nie martw się o to. Możesz również dodać nazwy sektorów, tworząc pusty utwór bez granic jako pierwszy utwór i dodać w nim nazwy sektorów (jak to, co robiącircos.initializeWithIdeogram()
i chordDiagram()
, po przejściu przez kolejne rozdziały).
podczas określania pozycji tekstu w kierunku y, do pozycji y tekstu dodaje się offsetmm_y(5)
(5 mm). W circos.text()
wartości x i Y są mierzone we współrzędnych danych (współrzędnych w komórce), a istnieją pewne funkcje pomocnicze, które konwertują jednostki bezwzględne na odpowiednie wartości w współrzędnych danych. Sekcja 2.8.2 zawiera więcej informacji o przeliczaniu jednostek współrzędnych obojętnych.
po utworzeniu ścieżki punkty są dodawane do pierwszej ścieżki przezcircos.trackPoints()
. circos.trackPoints()
po prostu dodaje punkty we wszystkich komórkach jednocześnie. Jak wyjaśniono w sekcji 3.2, można go umieścić, umieszczając circos.text()
w panel.fun
, jednakcircos.trackPoints()
byłoby wygodniej, gdyby tylko punkty były potrzebne do umieszczenia w komórkach (ale naprawdę nie polecam). Łatwo jest zrozumieć, że ta funkcja wymaga zmiennej kategorycznej (df$sectors
), wartości w kierunku x i y (df$x
i df$y
).
funkcje niskiego poziomu, takie jak circos.text()
, mogą być również używane pozapanel.fun
, jak pokazano w powyższym kodzie. Jeśli tak, sector.index
i track.index
muszą być wyraźnie określone, ponieważ sektor „bieżący” i ścieżka „bieżący”mogą nie być tym, czego chcesz. Jeśli grafika zostanie dodana bezpośrednio do ścieżki, która została ostatnio utworzona, track.index
może zostać pominięta, ponieważ ta ścieżka jest po prostu oznaczona jako „bieżąca” ścieżka.
OK, teraz dodajemy histogramy do drugiego utworu. Tutaj circos.trackHist()
jest funkcją wysokiego poziomu, co oznacza, że tworzy nową ścieżkę (jak można sobie wyobrazić hist()
jest również funkcją wysokiego poziomu). bin.size
jest jawnie ustawione tak, że binsize dla histogramów we wszystkich komórkach są takie same i mogą być porównywane do siebie. (Patrz rysunek 1.3)
bgcol = rep(c("#EFEFEF", "#CCCCCC"), 4)circos.trackHist(df$sectors, df$x, bin.size = 0.2, bg.col = bgcol, col = NA)
rysunek 1.3: Pierwszy przykład circlize, dodaj drugi utwór.
w trzeciej ścieżce i panel.fun
losowo wybraliśmy 10 punktów danych w każdej komórce, posortowaliśmy je według wartości x i połączyliśmy z liniami. W followingcode, gdy sectors
(pierwszy nienazwany argument), x
i y
argumenty są ustawione wcircos.track()
, wartości x i Y są dzielone przez df$sectors
i podzbiór wartości x i y są wysyłane do panel.fun
poprzezpanel.fun
’s x
i y
argumenty. Tak więc x
i y
w panel.fun
są właściwie wartościami w „bieżącej” komórce. (Patrz Rys. 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)})
rysunek 1.4: pierwszy przykład zakreślenia, dodaj trzeci utwór.
teraz wracamy do drugiej ścieżki i aktualizujemy komórkę w sektorze „d”.Odbywa się to przez circos.updatePlotRegion()
lub skróconą wersjęcircos.update()
. Funkcja usuwa grafiki, które zostały dodane.circos.update()
nie można modyfikować xlim
i ylim
komórki, a także innych ustawień związanych z położeniem komórki. circos.update()
musi wyraźnie określić indeks sektora i indeks ścieżki, chyba że”bieżąca” komórka jest tym, co chcesz zaktualizować. Po wywołaniu circos.update()
„bieżąca” komórka jest przekierowywana do komórki, którą właśnie podałeś i możesz użyć niskopoziomowych funkcji graficznych, aby dodać grafikę bezpośrednio do niej.(Patrz rysunek 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")
rysunek 1.5: pierwszy przykład zakreślenia, zaktualizuj drugi utwór.
następnie kontynuujemy tworzenie nowych utworów. Chociaż wróciliśmy do drugiego toru, podczas tworzenia nowego toru, nowy utwór jest nadal tworzony po torze, który jest najbardziej w środku. W tym nowym utworze dodajemy heatmapy circos.rect()
. Uwaga tutaj nie ustawiliśmy danych wejściowych, a po prostu ustawiliśmy argument ylim
, ponieważ mapy cieplne po prostu wypełniają całą komórkę od najbardziej lewej do prawej i od dołu do góry. Również dokładna wartość ylim
nie jest ważna, a x
, y
w panel.fun()
nie są używane (w rzeczywistości oba sąNULL
). (Patrz rysunek 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)})
rysunek 1.6: pierwszy przykład zakreślenia, dodaj czwarty utwór.
w najbardziej wewnętrznej części koła dodawane są linki lub wstążki. Mogą istnieć linki od pojedynczego punktu do punktu, punktu do interwału lub interwału do interwału. Sekcja 3.11 zawiera szczegółowe wykorzystanie linków. (Patrz rysunek 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)
rysunek 1.7: pierwszy przykład zakreślenia, dodaj linki.
wreszcie musimy zresetować parametry graficzne i zmienne wewnętrzne, aby nie zepsuć następnego wykresu.
circos.clear()