оптимизированная VennDiagram с внутренними метками r

Я пытаюсь построить диаграмму Венна оптимизированным способом (см. Ниже) и со случаями в качестве внутренних меток (а не с количеством случаев на каждом пересечении). Я знаю, что для каждого из них есть сообщение, но ни одно из решений не позволило мне сделать оба.

У меня есть это:

x <- list()
x$A <- as.character(c("Per_36","Cent","CeM","vDG","LAVL","RSGd"))
x$B <- as.character(c("vCA1","DLE","Per_36","vDG","DIE","Per_35"))
x$C <- as.character(c("vCA1","Cg1","LAVL", "RSGc", "RSGd","Per_35","Per_36"))
x$D <- as.character(c("Por","Cg1","RSGc","LAVL","Per_35","RSGd","Per_36"))


require(VennDiagram)
v0 <-venn.diagram(x, lwd = 3, col = c("red", "green", "orange", "blue"),
                fill = c("red", "blue", "green", "orange"), apha = 0.5, filename = NULL)
grid.draw(v0)
overlaps <- calculate.overlap(x)
overlaps <- rev(overlaps)
for (i in 1:length(overlaps)){
  v0[[i+8]]$label <- paste(overlaps[[i]], collapse = "\n")
}

grid.newpage()
grid.draw(v0)

Я получаю следующий вывод:

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

Что касается организации диаграммы Венна, я хочу сделать следующее:

c <- venn(x, simplify = TRUE, small = 0.5, intersections = TRUE)

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

который я получил из пакета gplots(), используя функцию venn с simplify = TRUE. Однако в функции venn я, похоже, не смогу заменить счетчики именами меток. Я использовал пересечения = TRUE, что по описанию аргумента должно работать, но не работает (хотя если я смотрю внутрь переменной c, информация там есть).

    Logical flag indicating if the returned object should have the attribute 
"individuals.in.intersections" featuring for every set a list of individuals
 that are assigned to it.

Вопрос: Можно ли с помощью VennDiagrampackage сделать то же самое, что и аргумент simplify в функции venn из пакета gplots?

Вопрос 2: Используя функцию venn из пакета gplots, есть ли способ отображать имена каждого элемента вместо количества элементов? Как я сделал в функции venn.diagram?

Заранее спасибо,


person CAOC    schedule 17.02.2016    source источник
comment
Я пытаюсь нарисовать диаграмму Венна с внутренними метками, и ваш вопрос является хорошим примером, у меня всего 3 списка, поэтому я не могу заставить его работать, потому что не могу понять, почему вы добавляете 8 к индексу в этой строке: v0[[i+8]]$label?   -  person Ibo    schedule 16.05.2018


Ответы (1)


Вот мой подход, который далеко не решение, а взлом.

# Print a venn and save it to an object
a <- venn(list(letters[1:5], letters[3:8]))
# save the intersections
b <- attr(a, "intersections")

# find the coordinates
s <- seq(0,500,100); abline(h=s); text(s, y=s, x=0)
s <- seq(0,500,50);  abline(v=s); text(s, y=0, x=s)

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

# the hack, destroy the venn to avoid the plotting of the internal numbers 
rownames(a) <- letters[1:nrow(a)]
a
plot.venn(a)
>Error in data[n, 1] : subscript out of bounds

# include the internal labels
text(200,300,paste(b$`01`,collapse = "\n"))
text(200,200,paste(b$`11`,collapse = "\n"))
text(200,100,paste(b$`10`,collapse = "\n"))

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

Это раздражает с несколькими venns. В противном случае вы можете сохранить venn как .svg и отредактировать его с помощью inkscape или аналогичного программного обеспечения или обратиться к разработчику по электронной почте.

Редактировать: если ваши графики всегда выглядят одинаково, вы можете проверить исходный код функции venn (в RStudio, нажав F2) и скопировать и вставить позиции для 4 и 5 круговых venns и заменить функцию меток lab("1000", data) нужными метками.

На 4 круга:

      text(35, 250, lab("1000", data))
      text(140, 315, lab("0100", data))
      text(260, 315, lab("0010", data))
      text(365, 250, lab("0001", data))
      text(90, 280, lab("1100", data), cex = small)
      text(95, 110, lab("1010", data))
      text(200, 50, lab("1001", data), cex = small)
      text(200, 290, lab("0110", data))
      text(300, 110, lab("0101", data))
      text(310, 280, lab("0011", data), cex = small)
      text(130, 230, lab("1110", data))
      text(245, 75, lab("1101", data), cex = small)
      text(155, 75, lab("1011", data), cex = small)
      text(270, 230, lab("0111", data))
      text(200, 150, lab("1111", data))

Редактировать

В настоящее время я бы переключился на решение ggplot

ggVennDiagram::ggVennDiagram(x)

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

person Roman    schedule 19.02.2016
comment
Мне нужно сгенерировать многие из этих диаграмм, ваше предложение потребует внимания к каждой диаграмме, которую я изначально не хочу тратить. Я сделаю это только в том случае, если мне действительно нужно. Но спасибо. Это способ поместить его туда. Обе функции позволяют получить каждый элемент в каждом пересечении, просто не позволяют разместить их на диаграмме более презентабельно. - person CAOC; 19.02.2016