Code covered by the BSD License  

Highlights from
venn

4.75

4.8 | 10 ratings Rate this file 41 Downloads (last 30 days) File Size: 11.3 KB File ID: #22282
image thumbnail

venn

by Darik

 

30 Nov 2008 (Updated 14 Feb 2011)

Plot 2- or 3- circle area-proportional Venn diagram

| Watch this File

File Information
Description

VENN Plot 2- or 3- circle area-proportional Venn diagram

VENN offers the following advantages over the VennX function available on the FEX:
1) It's much faster
2) Draws venn diagram as patch objects, allowing much greater flexibility in presentation (edge/face colors, transparency, etc.)
3) Returns a structure with required plotting data, allowing the user to make additional modifications (translation, scaling, rotation, etc.)
4) Supports multiple methods for optimizing the position of three-circle venn diagrams.

venn(A, I)
venn(Z)
venn(..., 'ErrMinMode', MODE)
H = venn(...)
[H, S] = venn(...)
[H, S] = venn(..., 'Plot', 'off')
S = venn(..., 'Plot', 'off')
[...] = venn(..., P1, V1, P2, V2, ...)

venn(A, I) by itself plots circles with total areas A, and intersection area(s) I. For two-circle venn diagrams, A is a two element vector of circle areas [c1 c2] and I is a scalar specifying the area of intersection between them. For three-circle venn diagrams, A is a three element vector [c1 c2 c3], and I is a four element vector [i12 i13 i23 i123], specifiying the two-circle intersection areas i12, i13, i23, and the three-circle intersection i123.

venn(..., 'ErrMinMode', MODE)
Used for 3-circle venn diagrams only. MODE can be 'TotalError' (default), 'None', or 'ChowRodgers'. When ErrMinMode is 'None', the positions and sizes of the three circles are fixed by their pairwise-intersections, which means there may be a large amount of error in the area of the three-circle intersection. Specifying ErrMinMode as 'TotalError' attempts to minimize the total error in all four intersection zones. The areas of the three circles are kept constant in proportion to their populations. The 'ChowRodgers' mode uses the the method proposed by Chow and Rodgers [Ref. 1] to draw 'nice' three-circle venn diagrams which appear more visually representative of the desired areas, although the actual areas of the circles are allowed to deviate from requested values.

H = venn(...) returns a two- or three- element vector of handles to the patches representing the circles.

[H, S] = venn(...) returns a structure containing descriptive valuescomputed for the requested venn diagram.

[...] = venn(..., P1, V1, P2, V2, ...) Specifies additional patch settings in standard Matlab parameter/value pair syntax. Parameters can be any valid patch parameter. Values for patch parameters can either be single values, or a cell array of length LENGTH(A), in which case each value in the cell array is applied to the corresponding circle in A.

See venn.m for additional options, descriptions, references, and examples.

Acknowledgements

Proportional Venn Diagrams inspired this file.

MATLAB release MATLAB 7.7 (R2008b)
Tags for This File  
Everyone's Tags
graphics, plotting, set, specialized, venn, venn diagram
Tags I've Applied
Add New Tags Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (18)
22 Mar 2013 Darik

@RyanG sure, just set the intersection between those two circles equal to the area of the smaller (enclosed) circle. But depending on the area of the third circle and its intesections, a solution may not be possible.

22 Mar 2013 Ryan G

Is it possible to create a 3-circle venn diagram such that 1 circle is entirely inside another?

05 Dec 2012 Darik

the cyclist: that would be a pretty embarrassing bug on my part. what about circles drawn by other functions, like:

cla, rectangle('Curvature', [1 1], 'Position', [0 0 1 1]); axis equal

?

04 Dec 2012 the cyclist

Great function. Seems to work just as advertised (in my limited trial). However, the areas don't look quite circular to me, whether or not I apply "axis square" after running venn.

Is that expected? I am using R2012b.

14 Nov 2012 Rob Campbell  
13 Mar 2012 Matt  
18 May 2011 moggces

[h, s] = venn([49, 58, 108], [33, 1, 17, 0], 'ErrMinMode', 'ChowRodgers');
This will prompt errors and can't generate h and s variables.

11 Mar 2011 Jeremy

Nevermind my last comment. As long as you center the text labels vertically and horizontally, the zone centroids work quite well. Nice work!

08 Mar 2011 Jeremy

Great job on the function. My only beef is that the zone centroids don't seem to be quite accurate.

14 Feb 2011 Darik

Hi Yuri,

You can try the ChowRodgers mode, which adjusts area ratios instead of absolute areas, and seems to give more satisfying results when actual solutions are impossible. Unfortunately when I tried your dataset I found a small bug in the code -- I just submitted a fix, but it will take a day or two to show up on FEX. If you want you can just fix it yourself: line 563 says:

x = NaN; y = NaN;

It should be edited to include:

x = NaN; y = NaN; sinTp = NaN; cosTp = NaN;

Then you can plot the approximate venn diagram with

venn([477 487 370 3 54 5 2], 'ErrMinMode', 'ChowRodgers')

14 Feb 2011 Yuri Kotliarov

Trying to build venn diagram with the vector v=[477 487 370 3 54 5 2];
Without any additional parameters I've got an error:
Exiting: Maximum number of function evaluations has been exceeded
- increase MaxFunEvals option.
Current function value: Inf
Worked only with
venn(v,'ErrMinMode','None');
but didn't get any 123 intersection. No problem with vennX, but I really like the idea of vector graphics.
I don't need exact proportions, something close would be good enough.

06 Sep 2010 Omar  
13 Jan 2010 Eran Mukamel

Thanks for the bug fix!

10 Jan 2010 Darik

Hey Eran, can you paste the error you get? Also what version of Matlab are you using?

10 Jan 2010 Eran Mukamel

Functionality of syntax: [H, S] = venn(...) does not work for me.

02 Apr 2009 Or Zuk  
30 Mar 2009 Darik

Hi Or,

You can do this with the returned structure:

[H, S] = venn(...)
for i = 1:length(S.ZoneCentroid)
text(S.ZoneCentroid(i,1), S.ZoneCentroid(i,2), num2str(S.ZonePop(i)));
end

30 Mar 2009 Or Zuk

Works great.

The only thing missing (which appears in VennX) is a display
the sizes of each set on the venn diagram itself. Is it easy to add this?

Updates
03 Apr 2009

Fixed a bug found by Or Zuk (bug report via email) where zone centroids weren't properly calculated for two-set diagrams.

12 Jan 2010

Fixed a bug found by Eran Mukamel where zone centroids in the returned structure were miscalculated in some cases.

12 Jan 2010

Fixed a typo in the help comments

14 Feb 2011

Bugfix: ChowRodgers mode failed when initial guess had zero three circle intersection

Contact us