UpsetR: visualização eficiente de diagramas de Venn - lmigueel/Bioinformatica GitHub Wiki

1. Sobre

UpsetR é um pacote em R que cria visualizações de conjuntos que se cruzam usando um novo design de matriz, junto com visualizações de vários conjuntos comuns, elementos e tarefas relacionadas a atributos.

Ele é super útil para representações complexas de três ou mais conjuntos numéricos. Diga adeus para aqueles gráficos de Venn horríveis com inúmeras intersecções.

Acesse o ótimo repositório deste maravilhoso pacote: https://github.com/hms-dbmi/UpSetR

Também veja as funcionalidades e ideias por trás do UpsetR: https://jku-vds-lab.at/tools/upset/

2. Instalação

As descrições do pacote você pode encontrar aqui.


install.packages("UpSetR")

ou você pode baixar a última versão do código pelo Github através do devtools:

devtools::install_github("hms-dbmi/UpSetR")

3. Exemplo clássico

Existe um diagrama de Venn clássico oriundo do genoma da banana. Ele mostra a relação do genoma da banana com outras cinco espécies:

Com certeza uma visualização com boas intenções, mas muito confusa. Para isso, o UpsetR apresenta de forma mais eficiente os dados de intersecção através de uma representação matricial, como mostrado abaixo:

4. Exemplos de uso

Vamos carregar a biblioteca:

library(UpSetR)

Normalmente temos nossas listas de entrada e comparamos elas. Existem duas opções de entrada para gerar um primeiro gráfico no UpsetR. A primeira é a partir de uma lista de conjuntos e a segunda a partir da das intersecções já conhecidas, que podem ser retiradas do Venn original.

Vamos para a primeira opção:

listInput <- list(one = c(1, 2, 3, 5, 7, 8, 11, 12, 13), two = c(1, 2, 4, 5, 10),
                  three = c(1, 5, 6, 7, 8, 9, 10, 12, 13))

O comando seguinte para gerar o gráfico, ordenado pela frequência (não indico) é:

upset(fromList(listInput), order.by = "freq")

A dica para melhorar a apresentação deste plot é apresentá-la na seguinte ordem:

1. Conjuntos independentes (conjunto diferença): os que possuem apenas uma "bolinha"no diagrama

2. Intersecções par a par: os que possuem duas ou mais "bolinhas" no diagrama

3. Intersecção total: a intersecção entre todos os conjuntos (possui bolinha em todas as linhas)

Deste modo, poderemos notar as diferenças primeiro e, por último, a relação de proximidade entre todos. Pensando nisso, vamos para a apresentação mais fácil e que eu mais utilizo. Eu determino a intersecção entre os conjuntos inicialmente e suas comparações. Posteriormente, eu passo como argumento para o UpSetR o nome dos conjuntos. Repare no exemplo anterior agrupado par a par:

expressionInput <- c(one = 2, two = 1, three = 2, `one&two` = 1, `one&three` = 4, 
                     `two&three` = 1, `one&two&three` = 2)

Aqui você controla a ordem de entrada para o UpSetR (use a flag "keep.order=TRUE"). Na entrada do UpSetR você utiliza a função fromExpression().

upset(fromExpression(expressionInput), order.by = "freq",sets=c("one","two","three"))

Uma das possibilidades é alterar o tamanho dos números, tamanho do ponto e a grossura da linha. Para isso, adicionem as flags text.scale, point.size e line.size, respectivamente. Vide exemplo:

upset(fromExpression(expressionInput), order.by = "freq",sets=c("one","two","three"),point.size=3.5,line.size=2,text.scale = 2)

As últimas são a respeito das mais diversas formas de manipulação do plot. Entre elas estão:

Retirar conjuntos vazios

Utilize a flag empty.intersections = "on"

Labels

Para colocar label no eixo x, utilize a flag sets.x.label. Já para o eixo y, utiilize a flag mainbar.y.label.

Rotacionar números

Para rotacionar os números em cima da barra, basta adicionar a flag number.angles com o angulo de rotação. Por exemplo, se você deseja rotacionar 45 graus, basta adicionar number.angles = 45.

Resumindo:

upset(fromExpression(expressionInput), number.angles = 45, mainbar.y.label = "Genre Intersections",text.scale = 2,
keep.order=TRUE, sets=c("one","two","three"),point.size=3.5,line.size=2)

Cores

Caso deseja adicionar cores às barras laterais à direita, basta adicionar a flag sets.bar.color. Por exemplo:

upset(fromExpression(expressionInput), set.bar.color="#56B4E9")

Caso queira mudar as cores das barras principais, basta adicionar a flag main.bar.color. Por exemplo:

upset(fromExpression(expressionInput), main.bar.color="red")

Caso queira adicionar uma cor para alguma barra em específico, você precisa criar uma lista de queries. O código abaixo mostra a possibilidade de alterar algumas barras do dataset 'movies' do UpSetR. Você precisa passar o nome do conjunto e também a cor, juntamente com a flag active=TRUE. Caso você FALSE, apenas será pintado a parte superior da barra.


movies <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), 
                   header = T, sep = ";")

upset(movies, main.bar.color = "black", queries = list(list(query = intersects, params = list("Drama"), color = "red", active = T), 
                                                  list(query = intersects,params = list("Action", "Drama"), active = T), 
                                                  list(query = intersects,params = list("Drama", "Comedy", "Action"), color = "orange", active = T))
      )

Para o nosso exemplo acima, vamos alterar a cor da intersecção entre os conjuntos "one" e "two". Basta adicionar as intersecções que deseja a lista de parâmetros:

upset(fromExpression(expressionInput), number.angles = 45, mainbar.y.label = "Genre Intersections",text.scale = 2,
      keep.order=TRUE, sets=c("one","two","three"),point.size=3.5,line.size=2,
      queries = list(list(query = intersects, params = list("one","two"), color = "red", active = TRUE))
     )   

Espero ter ajudado. Para mais informações, acessem o Github do UpSetR!

library(UpSetR)

movies <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), 
                   header = T, sep = ";")

upset(movies, nsets = 6, number.angles = 30, point.size = 3.5, line.size = 2, 
      mainbar.y.label = "Genre Intersections", sets.x.label = "Movies Per Genre", 
      text.scale = c(1.3, 1.3, 1, 1, 2, 0.75))


listInput <- list(one = c(1, 2, 3, 5, 7, 8, 11, 12, 13), two = c(1, 2, 4, 5, 10), 
                  three = c(1, 5, 6, 7, 8, 9, 10, 12, 13))

upset(fromList(listInput), order.by = "freq")

expressionInput <- c(one = 2, two = 1, three = 2, `one&two` = 1, `one&three` = 4, 
                     `two&three` = 1, `one&two&three` = 2)

upset(fromExpression(expressionInput), order.by = "freq",sets=c("one","two","three"))

upset(fromExpression(expressionInput), number.angles = 45,
      mainbar.y.label = "Genre Intersections",text.scale = 2,order.by = "freq",
      sets=c("one","two","three"),point.size=3.5,line.size=2,
      queries = list(list(query = intersects, 
                          params = list("one","two"), color = "red", active = TRUE)))