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