3
$\begingroup$

Background

Before beginning of my specific question I am stating that I have read the plotting - How to plot Venn diagrams with Mathematica, post.

In short what I want to achieve is a generalized function that takes a list of sets and plots their intersections with the size of each disc proportional to the cardinality of its respective set e.g. if we had three sets: $s_1, s_2, s_3$, where the respective cardinalities are $10, 3, 5$, it should be clear in the plot that $s_1$ is larger than $s_2$.

The hyperlinked post does a great job at taking arbitrary sets and showing the intersections. It, however, does not allow for a user to pass their own defined sets.

Code

For convenience I am copy-pasting the coding part of the answer from @FJRA: FJRA's Answer

VennDiagram2[n_, ineqs_: {}] := 
 Module[{i, r = .6, R = 1, v, grouprules, x, y, x1, x2, y1, y2, ve},
  v = Table[Circle[r {Cos[#], Sin[#]} &[2 Pi (i - 1)/n], R], {i, n}];
  {x1, x2} = {Min[#], Max[#]} &[
    Flatten@Replace[v, 
      Circle[{xx_, yy_}, rr_] :> {xx - rr, xx + rr}, {1}]];
  {y1, y2} = {Min[#], Max[#]} &[
    Flatten@Replace[v, 
      Circle[{xx_, yy_}, rr_] :> {yy - rr, yy + rr}, {1}]];
  ve[x_, y_, i_] := 
   v[[i]] /. Circle[{xx_, yy_}, rr_] :> (x - xx)^2 + (y - yy)^2 < rr^2;
  grouprules[x_, y_] = 
   ineqs /. 
    Table[With[{is = i}, Subscript[_, is] :> ve[x, y, is]], {i, n}];
  Show[
   If[MatchQ[ineqs, {} | False], {},
    RegionPlot[grouprules[x, y],
     {x, x1, x2}, {y, y1, y2}, Axes -> False]
    ],
   Graphics[v]
   , PlotLabel -> 
    TraditionalForm[Replace[ineqs, {} | False -> \[EmptySet]]], 
   Frame -> False
   ]
  ]

So if our three sets (but code should work for arbitrarily many) were:

s1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
s2 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
s3 = {8, 9, 10, 11, 12}

Thus the Venn Diagram would look something like this: enter image description here

Except the size of the discs should change depending on the cardinality of the passed in sets.

Thoughts?

$\endgroup$
  • $\begingroup$ So you're asking: given 3 positive integers, draw circles with those radii such that there each pair of circles has a nonempty intersection and all three circles have a nonempty intersection (plus other conditions I can't think of at the moment). Assuming you can always meet these conditions (I'm not convinced you can), placing the largest circle first is probably the way to go. $\endgroup$ – barrycarter Sep 20 '16 at 17:35
  • $\begingroup$ @barrycarter more or less, where the integers are representative of the set sizes... I also believe it will not work in any case, e.g. having a set an order of magnitude larger than the other would make it pretty hard if the circles are truly proportional. Perhaps then a rank to assign Large, Medium and Small sizes to the circles would be a compromise that may resolve this.... $\endgroup$ – SumNeuron Sep 21 '16 at 14:08
  • 1
    $\begingroup$ Maybe you can get some ideas from omics.pnl.gov/software/venn-diagram-plotter (the source code is available) $\endgroup$ – Gustavo Delfino Sep 21 '16 at 18:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.