Message Boards Message Boards


[WSS18] Visualization of Sets

Posted 1 year ago
1 Reply
8 Total Likes

NOTE: Package source can be found at:

Visualization of Sets


As most already know, Mathematica provides a wide range of visualizations with great presets for viewing one's data. However, its excellence does not preclude it from putative improvement.

Anyone who has wanted to make even a simple Venn-Diagram in Mathematica has probably sought out one of the following resources:

and even then, these solutions are more hot-fixes for such a fundamental chart type.

Furthermore, even if Venn-Diagram's were implemented in Mathematica they scale poorly. With $2^n$ comparisons needed to be shown, they can get out of hand fast. Just consider this Venn-Digram published in Nature that shows the relationship between the banana’s genome and the genome of five other species:

Bad Venn Diagram

Notice, that is hard to identify which comparison belongs to what region and the size of these regions have no relationship to cardinality of the subset represented there.


The UpSetChart is a new twist on visualizing comparisons between sets:

UpSetChart Concept

Here, each region of the Venn-Diagram is given it's own row in this "indicator grid", where each column represents a set.

In combination with two bar charts - one for set cardinalities and the other for comparison cardinality - it becomes clear how elements of sets are related to one another:

sets = <|
  "a" -> {7, 77, 53, 95, 42, 41},
  "b" -> {51, 88, 87, 67, 90, 37, 96},
  "c" -> {15, 87, 99, 6, 20, 87, 98, 68},
  "d" -> {46, 85, 6, 90},
  "e" -> {72, 97, 15, 55, 87}

UpSetChart[sets, "DropEmpty" -> False, "ComparisonSortBy" -> "Name", "SetSortBy" -> "Name", Axes->{True, True}]


*Note: I refer to comparisons rather than intersections as the bars which are aligned to parts of a Venn-Diagram are not true intersections; rather, they are only the elements which are unique to that comparison (e.g. intersection of those sets minus the union of all other sets). Otherwise, for example, if we look at the indicator grid for just set of B. B intersect B is all of . Yet as shown in the side-by-side image of the Venn-Diagrams and corresponding indicator grid, the dot for just B, means elements which are unique to the B part of the Venn-Digram (not an intersection).

While this is nice (and in the Notebook has useful tooltips), we already are starting to see that this is going to scale poorly.

Image if we had $20$ sets! For $20$ sets there are $1,048,576$ comparisons that would have to be visualized. Dropping empty sets, and sorting by cardinality allows for a clear overview of how these sets are related:

randomSets = RandomData[20];
UpSetChart[randomSets, "DropEmpty" -> True,
  "SetSortBy" ->  "Cardinality",
  "ComparisonSortBy" -> "Cardinality"


By removing the empty comparisons, we are still left with a lot of comparisons to look at. Although this is better than a traditional Venn-Diagram we can make our data even more accessible. If we group our comparisons by the number of sets being used to make the comparison, the chart becomes far more manageable:

  "DropEmpty" -> True,
  "SetSortBy" -> "Cardinality",
  "ComparisonSortBy" -> "Cardinality",
  "TabbedByComparisonsDegreeQ" -> True,
  "ImageSize" -> {Automatic, 250}


in gif form:


While this is by no means a perfect solution, it is a step in the right direction.

The UpSetChart package can be found here. There are several styling options. However, milage may vary as the axes are sort of hacked in there.

enter image description here - Congratulations! This post is now a Staff Pick as distinguished by a badge on your profile! Thank you, keep it coming!

Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
or Discard

Group Abstract Group Abstract