Area-weighted venn-diagrams for Python/matplotlib
====================================================
.. image:: https://travis-ci.org/konstantint/matplotlib-venn.png?branch=master :target: https://travis-ci.org/konstantint/matplotlib-venn
Routines for plotting area-weighted two- and three-circle venn diagrams.
The simplest way to install the package is via
easy_installor
pip::
$ easy_install matplotlib-venn
numpy,
scipy,
matplotlib.
The package provides four main functions:
venn2,
venn2_circles,
venn3and
venn3_circles.
The functions
venn2and
venn2_circlesaccept as their only required argument a 3-element list
(Ab, aB, AB)of subset sizes, e.g.::
venn2(subsets = (3, 2, 1))
and draw a two-circle venn diagram with respective region areas. In the particular example, the region, corresponding to subset
A and not Bwill be three times larger in area than the region, corresponding to subset
A and B. Alternatively, you can simply provide a list of two
setor
Counter(i.e. multi-set) objects instead (new in version 0.7), e.g.::
venn2([set(['A', 'B', 'C', 'D']), set(['D', 'E', 'F'])])
Similarly, the functions
venn3and
venn3_circlestake a 7-element list of subset sizes
(Abc, aBc, ABc, abC, AbC, aBC, ABC), and draw a three-circle area-weighted venn diagram. Alternatively, you can provide a list of three
setor
Counterobjects (rather than counting sizes for all 7 subsets).
The functions
venn2_circlesand
venn3_circlesdraw just the circles, whereas the functions
venn2and
venn3draw the diagrams as a collection of colored patches, annotated with text labels. In addition (version 0.7+), functions
venn2_unweightedand
venn3_unweighteddraw the Venn diagrams without area-weighting.
Note that for a three-circle venn diagram it is not in general possible to achieve exact correspondence between the required set sizes and region areas, however in most cases the picture will still provide a decent indication.
The functions
venn2_circlesand
venn3_circlesreturn the list of
matplotlib.patch.Circleobjects that may be tuned further to your liking. The functions
venn2and
venn3return an object of class
VennDiagram, which gives access to constituent patches, text elements, and (since version 0.7) the information about the centers and radii of the circles.
Basic Example::
from matplotlib_venn import venn2 venn2(subsets = (3, 2, 1))
For the three-circle case::
from matplotlib_venn import venn3 venn3(subsets = (1, 1, 1, 2, 1, 2, 2), set_labels = ('Set1', 'Set2', 'Set3'))
A more elaborate example::
from matplotlib import pyplot as plt import numpy as np from matplotlib_venn import venn3, venn3_circles plt.figure(figsize=(4,4)) v = venn3(subsets=(1, 1, 1, 1, 1, 1, 1), set_labels = ('A', 'B', 'C')) v.get_patch_by_id('100').set_alpha(1.0) v.get_patch_by_id('100').set_color('white') v.get_label_by_id('100').set_text('Unknown') v.get_label_by_id('A').set_text('Set "A"') c = venn3_circles(subsets=(1, 1, 1, 1, 1, 1, 1), linestyle='dashed') c[0].set_lw(1.0) c[0].set_ls('dotted') plt.title("Sample Venn diagram") plt.annotate('Unknown set', xy=v.get_label_by_id('100').get_position() - np.array([0, 0.05]), xytext=(-70,-70), ha='center', textcoords='offset points', bbox=dict(boxstyle='round,pad=0.5', fc='gray', alpha=0.1), arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5',color='gray')) plt.show()
An example with multiple subplots (new in version 0.6)::
from matplotlib_venn import venn2, venn2_circles figure, axes = plt.subplots(2, 2) venn2(subsets={'10': 1, '01': 1, '11': 1}, set_labels = ('A', 'B'), ax=axes[0][0]) venn2_circles((1, 2, 3), ax=axes[0][1]) venn3(subsets=(1, 1, 1, 1, 1, 1, 1), set_labels = ('A', 'B', 'C'), ax=axes[1][0]) venn3_circles({'001': 10, '100': 20, '010': 21, '110': 13, '011': 14}, ax=axes[1][1]) plt.show()
Perhaps the most common use case is generating a Venn diagram given three sets of objects::
set1 = set(['A', 'B', 'C', 'D']) set2 = set(['B', 'C', 'D', 'E']) set3 = set(['C', 'D',' E', 'F', 'G'])venn3([set1, set2, set3], ('Set1', 'Set2', 'Set3')) plt.show()
StackOverflow_ and tag them
matplotlib-venn_, chances are high you'll get an answer from the maintainer of this package.
Check out the
DEVELOPER-README.rstfor development-related notes. * Some alternative means of plotting a Venn diagram (as of October 2012) are reviewed in the blog post: http://fouryears.eu/2012/10/13/venn-diagrams-in-python/ * The
matplotlib-subsets_ package visualizes a hierarchy of sets as a tree of rectangles. * The
matplotlib_venn_wordcloud_ package combines Venn diagrams with word clouds for a pretty amazing (and amusing) result.