Хорошо выглядящие диаграммы Венна из пяти наборов

В статье я недавно наткнулся на симпатичную диаграмму Венна из 5 комплектов:

введите описание изображения здесь

Мне было интересно, какое программное обеспечение могло быть использовано для этого? Может ли это быть сделано в R возможно?

Кажется, что большинство пакетов, на которые я смотрел, дают менее ясную версию

введите описание изображения здесь

Какие-нибудь мысли?

РЕДАКТИРОВАТЬ: кажется, статья "Природа" использовала этот веб-инструмент: http://bioinformatics.psb.ugent.be/webtools/Venn/ может быть неплохо перенести его на какой-нибудь R-пакет, особенно на асимметричные Венны, которые в настоящее время недоступны в любой пакет, о котором я знаю

5 ответов

Решение

Для записи Adrian Dusa сделал действительно хороший новый пакет R venn что делает диаграммы Венна, как указано выше, для до 7 комплектов:

library(venn)
venn(5, ilab=TRUE, zcolor = "style")

venn(7, ilab=TRUE, zcolor = "style")

Спасибо Адриану за классную упаковку!

Я также использовал онлайновый генератор диаграмм Венна на сайте Биоинформатики Университета Гента и хотел, чтобы у меня была своя собственная функция. Идея, конечно же, состоит в том, чтобы каждая область пересечения имела разумный размер, чтобы текст для всех счетчиков мог иметь одинаковый размер. Вот моя попытка:

fiveCellVenn <- function(colorList=col2rgb(rainbow(5)),
                         cellCounts=seq(1,31,1),
                         cellLabels=c("one","two","three","four","five"),
                         saturation=.25){
  rotateVec <-function(vec,amount){
    return(c(vec[(amount+1):length(vec)], vec[1:amount]))
  }
  n=70
  xhull <- c()
  yhull <- c()
  for (i in 1:n){
    xhull <- c(xhull, cos((i*2*pi)/n))
    yhull <- c(yhull, sin((i*2*pi)/n))
  }
## The Venn cells begin as a 70-sided regular polygon
## plot(xhull, yhull)
## polygon(xhull, yhull)
## Multiply each unit vector in the hull by a scalar, arrived at by 
## iterative adjustment.
  adjust <-c(10,10.35,10.6,10.5,10.4,10.3,10.1,9.6,9,8.5,
             8,7.625,7.25,7.125,7,6.875,6.75,6.875,7,7.125,
             7.25,7.625,8.1,9.125,10.25,11.375,12.5,13.15,13.8,14.3,
             14.6,14.725,14.7,14.7,14.7,14.4,14.1,13.8,13.5,12.8,
             12.1,11.15,10.2,9.6,8.95,8.3,7.7,7,6.25,5.6,
             5,4.75,4.5,4.25,4,3.8,3.6,3.45,3.45,3.45,
             3.5,3.625,3.75,3.825,4,4.25,4.5,5.75,7.25,8.5)
  newxhull <- xhull*adjust
  newyhull <- yhull*adjust
## Text location was also done by hand:
  textLocationX <- c(-13,-3,8,9,-4,-7.5,7.5,-9,-8,4,6.5,-2,9,-4,1.4,4,-7.5,-3.5,7.5,-6,-6.5,6,1.5,4,-0.5,4.5,0,-5,-3.5,3.5,0)
  textLocationY <- c(1,12,8,-8,-12,6.5,4.5,1,-4,8.5,-6,8.5,-1.5,-8,-9,5,3.5,6,1.5,-6,-1.5,-2,8,-7,-6.5,2,5.5,2,-3.5,-4,0)
  textLocationMatrix <- matrix(cbind(textLocationX,textLocationY),nrow=31,ncol=2)
  plot(newxhull, newyhull, pch=".", xlim=c(-16,16), ylim=c(-16,16),
       axes=FALSE,xlab="",ylab="")
  newAdjust<-adjust
  for (i in 1:5){
    newxhull <- xhull*newAdjust
    newyhull <- yhull*newAdjust
    polygon(newxhull, newyhull, 
            border=rgb(colorList[1,i]/255, colorList[2,i]/255, colorList[3,i]/255, 1),
            lwd=2,
            col=rgb(colorList[1,i]/255, colorList[2,i]/255, colorList[3,i]/255,saturation))
    newAdjust <- rotateVec(newAdjust,14)
  }
  text(textLocationMatrix[,1], textLocationMatrix[,2],labels=as.character(cellCounts))
  text(textLocationMatrix[c(17,2,3,24,14),1]*c(2,1.25,1.5,2,2),
       textLocationMatrix[c(17,2,3,24,14),2]*c(2,1.35,1.5,2,2),
       labels=cellLabels)
##  uncomment and run to get points and grid for adjusting text location
##  points(textLocationMatrix[,1], textLocationMatrix[,2])
##  for (i in -16:16){
##   if (i%%5==0){
##     color="black"
##   }else{
##     color="lightblue"
##   }
##  abline(v=i,col=color)
##  abline(h=i, col=color)
##  }
}

затем

fiveCellVenn()

Изображение Венна Диаграмма

дает Венна, похожего на ваш первый. У меня пока нет представителя, чтобы опубликовать изображение. Возможно, вы захотите приглушить цвета и переместить имена ячеек вокруг.

library(venn); library(tidyverse); library(stringr); 

p_th = 0.0;

data <- read_csv("finaldf.csv")
data

venn = 
  list(A = 
     data %>% 
     filter(CVA > p_th) %>% 
     .$phrase,
   B = 
     data %>% 
     filter(IHD > p_th) %>% 
     .$phrase,
   C = 
     data %>% 
     filter(CM > p_th) %>% 
     .$phrase,
   D = 
     data %>% 
     filter(ARR > p_th) %>% 
     .$phrase,
   E = 
     data %>% 
     filter(VD > p_th) %>% 
     .$phrase,
   G = 
     data %>% 
     filter(CHD > p_th) %>% 
     .$phrase);

png("ven.png", width = 800, height = 800)

venn.result =
  venn(venn, ilabels = TRUE, 
       zcolor = "style", size = 25, cexil = 1.2, cexsn = 1.5);


dev.off()

Диаграмма Венна 6 комплектов

IMG

Возможно, вы можете попробовать VennDetail, который не только поможет вам сгенерировать венндиаграмму, но и даст вам возможность сгенерировать фигуру Веннпи. Вы также можете легко выделить каждое подмножество на основе рисунка.

Пожалуйста, не используйте диаграммы Венна, если есть пять категорий, потому что это слишком сложно для глаз читателей. Попробуйте что-то вроде этого: https://github.com/const-ae/ggupset .

Другие вопросы по тегам