1.2 a quick glance
Before we go too deep into the details, I first demonstrate a simple examplewith using basic functionalities in circlize package to help you to get a basic idea of how the package works.
Primeiro vamos gerar alguns dados aleatórios. É necessário um vector de caracteres para representar Categorias, um vector numérico de valores x e um vectoe de valores y.
set.seed(999)n = 1000df = data.frame(sectors = sample(letters, n, replace = TRUE), x = rnorm(n), y = runif(n))
primeiro iniciamos o layout circular. O círculo é dividido em sectores com base no intervalo de dados em eixos x em cada categoria. No código seguinte, df$x
é dividido por df$sectors
e a largura dos sectores é automaticamente calculada com base em intervalos de dados em cada categoria. Por omissão, os sectores são posicionados a partir de \(\theta = 0\) (no sistema de coordenadas polares) e vão ao longo do circuito-sabiamente. Você pode não ver nada depois de correr seguindo o código porque notrack foi adicionado ainda.
library(circlize)circos.par("track.height" = 0.1)circos.initialize(df$sectors, x = df$x)
definimos um parâmetro global track.height
para 0.1 pela opção funçãocircis.par()
de modo que todas as faixas que serão adicionadas tenham uma altura padrão de 0. 1. O círculo utilizado pela circular tem sempre um raio de 1, pelo que uma altura de 0,1 significa 10% do raio do círculo. Em capítulos posteriores, você pode encontrar como definir a direita com unidades físicas, por exemplo cm.
Note que a alocação de setores só precisa de valores na direção x( oron a direção circular), os valores na direção y (direção radical) serão usados no passo de criar trilhas.
após a disposição circular ser inicializada, os gráficos podem ser adicionados ao gráfico de uma forma via-a-via. Antes de desenhar qualquer coisa, precisamos saber que todas as trilhas devem ser criadas primeiro por circos.trackPlotRegion()
ou, para abreviar,circos.track()
, então as funções de baixo nível podem ser adicionadas depois. Justthink in the base R graphic engine, you need first call plot()
then you canuse functions such as points()
and lines()
to add graphics. Uma vez que x-rangesfor cells na faixa já foram definidos no passo de inicialização,aqui só precisamos especificar o intervalo y para cada célula. OS Y-ranges podem ser bespecificados por y
argumento como um vetor numérico (de modo que o y-range será extraído e calculado de forma beautomática em cada célula) ou ylim
argumento como avetor do comprimento dois. Em princípio, as gamas de y devem ser as mesmas para todas as células na faixa de asame. (Ver 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: primeiro exemplo de circuito, adicionar a primeira via.
os eixos para a parcela circular são normalmente desenhados no mais exterior do círculo. Aqui adicionamos eixos na primeira faixa, colocando circos.axis()
insida a função auto-definida panel.fun
(ver o código acima). circos.track()
cria uma região plotora de forma célula a célula e o panel.fun
é executado na prática imediatamente após a região plotora de uma determinada célula iscriada. Assim, panel.fun
na verdade significa adicionar gráficos na “currentcell” (o uso de panel.fun
é discutido mais adiante na seção 2.7).Sem especificar quaisquer argumentos, circos.axis()
desenha x-axes no topo de cada célula (ou no exterior de cada célula).
também, adicionamos o nome do setor fora da primeira faixa usando circos.text()
.CELL_META
fornece “meta informação” para a célula atual. Existem vários parâmetros que podem ser recuperados por CELL_META
. Toda a sua utilização é explicada na secção 2.7. Em código acima, os nomes do sector são desenhados fora das células e você pode ver mensagens de aviso dizendo pontos de dados que ultrapassam as regiões plotting. Está tudo bem e não te preocupes com isso. Você também pode adicionar nomes de setores, criando uma faixa vazia sem fronteiras como a primeira faixa e adicionar nomes de setores nela (como o quecircos.initializeWithIdeogram()
e chordDiagram()
fazem, depois de passar por capítulos seguintes).
ao especificar a posição do texto na direcção y, é adicionado um desvio de mm_y(5)
(5mm) à posição y do texto. In circos.text()
, x and yvalues are measured in the data coordinate( the coordinate in cell), and there are some helper functions that convert absolute units to corresponding valuresin data coordinate. O secto2. 8. 2 fornece mais informações sobre a conversão de unidades coordenadas indiferentes.
depois que a faixa é criada, pontos são adicionados à primeira faixa porcircos.trackPoints()
. circos.trackPoints()
simplesmente adiciona pontos em todas as células simultaneamente. Tal como explicado na secção 3.2, ele pode ser substituído por colocar circos.text()
em panel.fun
, no entanto,circos.trackPoints()
seria mais conveniente se apenas os pontos são necessários para colocar nas células (mas eu realmente não recomendo). É bastante simples compreender que esta função necessita de uma variável categórica (df$sectors
), valores na direcção x e direcção y (df$x
e df$y
).
funções de baixo nível tais como circos.text()
também podem ser usadas fora depanel.fun
como mostrado no código acima. Se assim for, sector.index
e track.index
precisam ser especificados explicitamente porque a faixa” atual “e”atual” pode não ser o que você quer. Se os gráficos são diretamente adicionados ao thetrack que são mais recentemente criados, track.index
pode ser ommitido porque esta faixa é apenas marcada como a faixa “atual”.
OK, agora adicionamos histogramas à segunda faixa. Aqui circos.trackHist()
é uma função de alto nível, o que significa que cria uma nova faixa (como você pode imaginar hist()
também é uma função de alto nível). bin.size
é explicitamente definido de modo que o binsize para histogramas em todas as células são os mesmos e podem ser comparados uns aos outros. (Ver 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: Primeiro exemplo de circlize, adicione a segunda faixa.
na terceira faixa e em panel.fun
, escolhemos aleatoriamente 10 pontos de dados em cada célula, ordená-los por valores x e conectá-los com linhas. Em followingcode, quando sectors
(o primeiro argumento sem nome), x
e y
argumentos são definidos emcircos.track()
, valores de x e y os valores são divididos por df$sectors
andcorresponding subconjunto de valores de x e y são enviadas para panel.fun
porpanel.fun
‘s x
e y
argumentos. Assim, x
an y
in panel.fun
areexactly the values in the” current ” cell. (Ver 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: primeiro exemplo de circuito, adicionar a terceira via.
now we go back to the second track and update the cell in sector “d”.Isto é feito por circos.updatePlotRegion()
ou a versão curtacircos.update()
. A função apaga gráficos que foram adicionados.circos.update()
não pode modificar o xlim
e ylim
da célula, assim como outras configurações relacionadas com a posição da célula. circos.update()
é necessário especificar explicitamente o índice de sector e o índice de faixa, a menos que a célula”actual” seja o que deseja actualizar. Após a chamada de circos.update()
, a célula” atual ” é redirecionada para a célula que você acabou de especificar e você pode usar funções gráficas de baixo nível para adicionar gráficos diretamente nela.(Ver 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: primeiro exemplo de circuito, actualizar a segunda via.
em seguida, continuamos a criar novas faixas. Embora tenhamos voltado para a segunda faixa, ao criar uma nova faixa, a nova faixa ainda é criada após a faixa que está mais dentro. Nesta nova faixa, adicionamos heatmaps por circos.rect()
. Note aqui que nós não definimos os dados de entrada, enquanto simplesmente definir ylim
argumento porque heatmaps apenas preencher a célula inteira a partir da esquerda para a direita e de baixo para cima. Além disso, o valor exacto de ylim
não é importante e x
, y
em panel.fun()
não são utilizados (na verdade são ambosNULL
). (Ver 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: primeiro exemplo de circuito, adicionar a quarta via.
no mais interior do círculo, são adicionadas ligações ou fitas. Pode haver ligações de um ponto a ponto, ponto A intervalo ou intervalo A intervalo. A secção 3.11 dá uma utilização detalhada das ligações. (Ver 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: primeiro exemplo de circuito, adicionar ligações.
finalmente precisamos reiniciar os parâmetros gráficos e as variáveis internas, para que não estrague o seu próximo gráfico.
circos.clear()