Diagramas de Venn con matplotlib

Diagramas de Venn con matplotlib

matplotlib_venn es un paquete de Python que provee funciones para dibujar diagramas de Venn de dos y tres clases o conjuntos. Corre en las veriones 2.x y 3.x.

Se instala sencillamente vía pip:

pip install matplotlib_venn

Este comando también instalará las dependencias requeridas: SciPy, NumPy y matplotlib.

Alternativamente puedes visitar la página de PyPI, descargar el código de fuente y ejecutar:

python setup.py install

Dibujar un diagrama

El procedimiento mínimo para dibujar un diagrama de Venn es el siguiente.

from matplotlib import pyplot as plt
from matplotlib_venn import venn2

venn2((1, 1, 1))

plt.show()

La función venn2() genera un diagrama de dos conjuntos, como se muestra a continuación.

Diagrama de Venn (venn2)

El argumento indica el tamaño relativo de los tres subconjuntos en este orden: Ab (izquierda), aB (derecha), AB (intersección). Así, la tupla (1, 2, 1) dibujaría el conjunto B del doble de tamaño respecto de A.

Para identificar a cada uno de los subconjuntos (tres en diagramas de dos conjuntos) el módulo utiliza una nomenclatura que consiste en colocar un 1 para indicar que la sección está incluida en el conjunto y un 0 para indicar que está excluida. De esta manera, siguiendo el orden «ABC», el subconjunto 10 es el de la izquierda (el que pertenece a A pero no a B); el 01, el de la derecha (el que pertenece a B pero no a A); y el 11, el del medio (la intersección).

Teniendo esto en cuenta, como primer argumento también podemos pasar un diccionario indicando el tamaño de cada uno de los subconjuntos.

venn2({"10": 1, "01": 2, "11": 1})

El parámetro set_labels permite cambiar los nombres de los conjuntos mostrados en el diagrama.

venn2((1, 1, 1), set_labels=("X", "Z"))

Indicando set_labels=None se remueven las referencias de la imagen.

set_colors determina el color de los conjuntos.

venn2((1, 1, 1), set_colors=("#888888", "#0000FF"))

El color de las instersecciones es calculado automáticamente.

Diagrama de Venn (venn2)

Nótese que, por defecto, tienen un valor alpha de 0.4, i.e., 60% de transparencia. Utilícense valores de 0.0 a 1.0 en el parámetro de ese mismo nombre.

# Deshabilita la transparencia.
venn2((1, 1, 1), set_colors=("#888888", "#0000FF"), alpha=1)

La función venn2() retorna una instancia de una clase llamada VennDiagram. En particular, los métodos de ésta que nos interesan son get_label_by_id() y get_patch_by_id(). Ambas toman un subconjunto y retornan instancias de matplotlib.text.Text y matplotlib.patches.PathPatch, respectivamente. A partir de ellas podemos modificar individualmente el aspecto de cada subconjunto. Por ejemplo, el siguiente código cambia el color y el texto del subconjunto 11 (i.e. AB).

diagram = venn2((1, 1, 1))
diagram.get_label_by_id("11").set_text("Intersección")
diagram.get_label_by_id("11").set_color("#FFFFFF")

Diagrama de Venn (venn2)

O bien alterar el color de un subconjunto en particular:

# Establece el color del conjunto B.
diagram.get_patch_by_id("01").set_color("#0000FF")

La función venn3() es esencialmente similar. El primer argumento será ahora una tupla de siete elementos que se corresponden con los siete subconjuntos en el siguiente orden: Abc, aBc, ABc, abC, AbC, aBC, ABC.

from matplotlib_venn import venn3

diagram = venn3((1, 1, 1, 1, 1, 1, 1))

Diagrama de Venn (venn3)

De la misma forma, para identificar a cada uno de los subconjuntos se emplean ahora tres dígitos según el orden A, B, C. La imagen a continuación muestra cada uno de ellos con su respectivo identificador.

Subconjuntos (venn3)

Generado por el siguiente código:

diagram = venn3((3, 3, 1, 3, 1, 1, 1))

for subset in ("111", "110", "101", "100", "011", "010", "001"):
    diagram.get_label_by_id(subset).set_text(subset)

Para esta función también aplican los argumentos alpha, set_labels y set_colors. Estos últimos dos requieren, lógicamente, tuplas de tres elementos.

Otras opciones

Las funciones venn2_circles() y venn3_circles() dibujan los contornos de los subconjuntos correspondientes según el primer argumento.

from matplotlib_venn import venn3_circles

venn3_circles((1, 1, 1, 1, 1, 1, 1))

Contorno del diagrama de Venn (venn3_circles)

Pueden ser utilizadas en conjunción con venn2() y venn3() para añadir bordes a los diagramas. Además, soportan los parámetros color, alpha, linewidth y linestyle para configurar color, transparencia, tamaño (en píxeles) y tipo de línea. Potenciales valores para linewidth son ":", "-.", "--" y "-" según la referencia de matplotlib.

from matplotlib_venn import venn3, venn3_circles

subsets = (3, 3, 1, 3, 1, 1, 1)
venn3(subsets)
venn3_circles(subsets, color="#008000", alpha=1, linestyle="-.", linewidth=3)

Diagrama de Venn con contorno (venn3)

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

Deja una respuesta