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$
3
  • $\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$
    – user1722
    Sep 20, 2016 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, 2016 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$ Sep 21, 2016 at 18:21

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.