Circular Visualization in R

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)
 primeiro exemplo de circlize, adicione a primeira faixa.

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.indexprecisam 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)
 primeiro exemplo de circlize, adicione a segunda faixa.

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)})
Primeiro exemplo de circlize, adicione a terceira faixa.

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")
 primeiro exemplo de circlize, atualizar a segunda faixa.

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)})
 primeiro exemplo de circlize, adicione a quarta faixa.

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)
 primeiro exemplo de circlize, adicionar links.

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()

Deixe uma resposta

O seu endereço de email não será publicado.