Как с помощью R или Matplotlib (Python) создать диаграмму Венна на основе сравнения значений для каждой строки CSV-файла?

У меня есть проект, который требует создания диаграмм Венна, и я начинаю изучать Python (используя 2.7), поэтому я решил, что попытка изучения R также перегрузит меня работой. Итак, я узнал в Интернете о matplotlib. По сути, мне нужно создать диаграмму Венна, которая сравнивает значения в каждом столбце для создания диаграммы Венна. Итак, если бы мой csv имел следующие данные:

Month    x    y
Sept    -1    1
Oct    0    1
Nov    1    1
Dec    -1    -1

Перекрытие покажет значение 2 (поскольку nov и dec имеют одинаковое значение), кружок x сам по себе покажет значение 1, начиная с sept (0 нужно игнорировать), а кружок y покажет значение из 2, с сентября и октября.

Я думаю, что это довольно сложная программа, но я понятия не имею, с чего начать, кроме как начать с:

from matplotlib_venn import venn2

Когда я использую онлайн-инструмент, такой как Venny, он просто находит похожие числа. между списками вместо построчного сравнения. Это ничего не дает в значениях 0 во внешних кругах и числе 3 в перекрытии (поскольку на входе есть три разных значения: -1, 0 и 1.

В качестве альтернативы, если бы было очень просто использовать R вместо Python, не могли бы вы помочь мне с этим?

Любая помощь будет оценена, спасибо!


person Nick    schedule 02.12.2013    source источник


Ответы (2)


В R есть много вариантов построения диаграммы Венна. Вы можете получить некоторые из них

library(sos)
findFn('Venn diagramm')

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

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

library(VennDiagram)
# You should replace the random values here by your set of values
## 
set.seed(1)
A <- sample(1:100, 25, replace = FALSE)
B <- sample(1:100, 25, replace = FALSE)
C <- sample(1:100, 25, replace = FALSE)
D <- sample(1:100, 25, replace = FALSE)

venn.plot <- venn.diagram(
    x = list(
        Sept = A,
        Oct = D,
        Nov = B,
        Dec = C
    ),
    filename = NULL,
    col = "transparent",
    fill = c("cornflowerblue", "green", "yellow", "darkorchid1"),
    alpha = 0.50,
    label.col = c("orange", "white", "darkorchid4", "white", 
                                "white", "white", "white", "white", "darkblue", "white", 
                                "white", "white", "white", "darkgreen", "white"),
    cex = 1.5,
    fontfamily = "serif",
    fontface = "bold",
    cat.col = c("darkblue", "darkgreen", "orange", "darkorchid4"),
    cat.cex = 1.5,
    cat.pos = 0,
    cat.dist = 0.07,
    cat.fontfamily = "serif",
    rotation.degree = 270,
    margin = 0.2
)

grid.draw(venn.plot)
person agstudy    schedule 02.12.2013
comment
Это здорово, спасибо! Но на самом деле я хочу, чтобы круги были x и y, поэтому перекрытие было бы количеством строк, в которых значения одинаковы. Месяц на самом деле является посторонней информацией, извините, что не уточнил это. - person Nick; 02.12.2013

Я не совсем понимаю ваши цифры, но пакет matplotlib-venn довольно прост в использовании. В вашем примере с (Xy, Yx, XY) = (1, 2, 2) из вашего текста вы просто запустите

import matplotlib_venn as venn
v = venn.venn2((1, 2, 2))
v.get_label_by_id('A').set_text('x')
v.get_label_by_id('B').set_text('y')

Документы находятся здесь и достаточно просты. Более сложным будет извлечение кортежа (Xy, Yx, XY) из данных, но я не очень понимаю ваш расчет, извините. Если вы можете объяснить это немного больше, возможно, я могу дать еще несколько советов.

person jmz    schedule 02.12.2013