How to Create a Venn Diagram in R (8 Examples)

 

This article illustrates how to draw venn diagrams in the R programming language. Venn diagrams are also referred to as primary diagram, set diagram, or logic diagram.

Table of contents:

Let’s do this:

 

Setting Up VennDiagram Package

In the examples of this R tutorial, we’ll use functions provided by the VennDiagram add-on package for the R programming language. In order to use the functions of VennDiagram, we need to install and load the package first:

install.packages("VennDiagram")                       # Install VennDiagram package
library("VennDiagram")                                # Load VennDiagram package

I recommend to have a look at the help documentation of the VennDiagram package. However, in the following examples you’ll learn how to apply the main functions of the VennDiagram package.

 

Example 1: Single Venn Diagram in R

Example 1 shows how to draw a single venn diagram, i.e. only one circle. Have a look at the following R code:

grid.newpage()                                        # Move to new plotting page
draw.single.venn(area = 10)                           # Create single venn diagram

 

Venn Diagram Example 1

Figure 1: Single Venn Diagram in R.

 

Figure 1 is visualizing the output of the previous R syntax. Note that the previous code contains two steps.

First, we are creating a new plotting page with the grid.newpage function. We should usually do this step before the creation of each venn diagram, because otherwise the venn diagram is just overlaying previously created plots.

Second, we are producing our single venn diagram with the draw.single.venn function. All we are specifying within the function is the size of our area (i.e. 10).

 

Example 2: Pairwise Venn Diagram

The VennDiagram package provides functions for the production of venn diagrams of basically every number of sets (i.e. circles). The draw.pairwise.venn is used to draw pairwise venn diagrams.

If we want to apply the draw.pairwise.venn command, we need to specify the sizes of the areas of both sets as well as the intersection of the two sets:

grid.newpage()                                        # Move to new plotting page
draw.pairwise.venn(area1 = 10,                        # Create pairwise venn diagram
                   area2 = 20,
                   cross.area = 2)

 

Venn Diagram Example 2

Figure 2: Pairwise Venn Diagram.

 

Figure 2 is showing the output of our previous R code. As you can see, the size of the areas are reflected in the visualization of the pairwise venn diagram.

 

Example 3: Venn Diagram with Three Sets

Similar to the R programming code of Example 2, we can use the draw.triple.venn function to create a venn diagram with three sets. Note that this time we need to specify three different area values as well as the pairwise intersections and the intersection area of all sets:

grid.newpage()                                        # Move to new plotting page
draw.triple.venn(area1 = 10,                          # Create venn diagram with three sets
                 area2 = 20,
                 area3 = 15,
                 n12 = 2,
                 n23 = 3,
                 n13 = 7,
                 n123 = 2)

 

Venn Diagram Example 3

Figure 3: Triple Venn Diagram.

 

Note that the VennDiagram package provides further functions for more complex venn diagrams with multiple sets, i.e. draw.quad.venn, draw.quintuple.venn, or the more general function venn.diagram, which is taking a list and creates a TIFF-file in publication-quality.

However, for simplicity we’ll stick to the triple venn diagram in the remaining examples of this R tutorial.

 

Example 4: Change Color of Venn Diagram

In Example 4, I’ll show you how to make a venn diagram with colored lines around the circles and a filling color of the circles. The following R code is the same as in Example 3, but in addition we are specifying the line color to be red and the filling color to be blue (with the HEX-code #1b98e0). Have a look at the output:

grid.newpage()                                        # Move to new plotting page
draw.triple.venn(area1 = 10,                          # Change color of venn diagram
                 area2 = 20,
                 area3 = 15,
                 n12 = 2,
                 n23 = 3,
                 n13 = 7,
                 n123 = 2,
                 col = "red",
                 fill = "#1b98e0")

 

Venn Diagram Example 4

Figure 4: Venn Diagram with Color.

 

Example 5: Specify Different Color for Each Set

We can also specify a different color for each of the sets of our venn diagram. For this task, we need to set the fill argument to be equal to a vector of colors. Each element of this vector is defining the color of one of the circles:

grid.newpage()                                        # Move to new plotting page
draw.triple.venn(area1 = 10,                          # Different color for each set
                 area2 = 20,
                 area3 = 15,
                 n12 = 2,
                 n23 = 3,
                 n13 = 7,
                 n123 = 2,
                 col = "red",
                 fill = c("pink", "green", "orange"))

 

Venn Diagram Example 5

Figure 5: Different Color for Each Circle.

 

Example 6: Disable Transparency of Venn Diagram

You may have noticed that the previous venn diagrams are transparent, i.e. showing the intersections in a mixed and overlapping color. If we want to reduce or even disable this transparency, we can use the alpha argument of the VennDiagram functions. An alpha of 1, as shown below, is disabling the transparency completely:

grid.newpage()                                        # Move to new plotting page
draw.triple.venn(area1 = 10,                          # Disable transparency of venn diagram
                 area2 = 20,
                 area3 = 15,
                 n12 = 2,
                 n23 = 3,
                 n13 = 7,
                 n123 = 2,
                 col = "red",
                 fill = c("pink", "green", "orange"),
                 alpha = 1)

 

Venn Diagram Example 6

Figure 6: No Transparency in Venn Diagram.

 

Example 7: Remove Lines from Venn Diagram

The VennDiagram functions provide the possibility to remove the lines around the circles by specifying the lty argument to be equal to blank. Let’s do this in practice:

grid.newpage()                                        # Move to new plotting page
draw.triple.venn(area1 = 10,                          # Remove lines from venn diagram
                 area2 = 20,
                 area3 = 15,
                 n12 = 2,
                 n23 = 3,
                 n13 = 7,
                 n123 = 2,
                 fill = c("pink", "green", "orange"),
                 lty = "blank")

 

Venn Diagram Example 7

Figure 7: Venn Diagram without Lines.

 

Example 8: Add Name to Each Set of Venn Diagram

Finally, I want to show you how to assign category names (or labels) to each of our sets. We can do that by assigning a vector of category names to the category option of the VennDiagram functions:

grid.newpage()                                        # Move to new plotting page
draw.triple.venn(area1 = 10,                          # Add name to each set
                 area2 = 20,
                 area3 = 15,
                 n12 = 2,
                 n23 = 3,
                 n13 = 7,
                 n123 = 2,
                 fill = c("pink", "green", "orange"),
                 lty = "blank",
                 category = c("Group 1", "Group 2", "Group 3"))

 

Venn Diagram Example 8

Figure 8: Adding Category Names.

 

Figure 8 is the same as Figure 7, but this time it is showing labels for each circle.

 

Video, Further Resources & Summary

If you need further info on the examples of this page, you might want to watch the following video which I have published on my YouTube channel. In the video, I illustrate the R codes of this tutorial.

 

 

Additionally, you might read the other tutorials of my website.

 

In summary: In this R tutorial you learned how to generate a venn diagram in RStudio. Please tell me about it in the comments section, if you have further questions or comments. Furthermore, don’t forget to subscribe to my email newsletter in order to receive updates on the newest articles.

 

Subscribe to the Statistics Globe Newsletter

Get regular updates on the latest tutorials, offers & news at Statistics Globe.
I hate spam & you may opt out anytime: Privacy Policy.


38 Comments. Leave new

  • Hi Mr. As you know in Venn Diagramm we have to put some words in every venn. I would like to know how to do it with R

    Reply
    • Hi Elisee,

      That’s actually a bit tricky (as far as I know). I found this forum thread on Stack Overflow, based on which I created the following R code:

      grid.newpage()                                                       # Move to new plotting page
      venn.plot <- draw.pairwise.venn(area1 = 10,                          # Create pairwise venn diagram
                                      area2 = 20,
                                      cross.area = 2)
       
      addlab <- function(lab, x, y, offset = 0) {                          # Create own function
        grid.text(lab, unit(as.numeric(x), "npc"), 
                  unit(as.numeric(y) - offset, "npc"), 
                  draw = FALSE)
      }
       
      my_labels <- c("text_1", "text_2", "text_3", "text_4", "text_5")     # Define text for each element
      lbls <- gList()
      text_counter <- 1
       
      for(i in seq(along.with = venn.plot)) {
        if(regexpr("text", venn.plot[[i]]$name) > 0) {                     # Check if it is a grid.text object
          lbls <- gList(lbls,                                              # Write counter value below existing label
                        addlab(my_labels[text_counter],
                               venn.plot[[i]]$x,
                               venn.plot[[i]]$y,
                               0.03))
          text_counter <- text_counter + 1                                 # Increase counter
        }
      }
       
      grid.draw(venn.plot)                                                 # Draw venn diagram
      grid.draw(lbls)                                                      # Add text

      You may replace text_1… by any text you want.

      I hope that helps!

      Joachim

      Reply
  • In the triple venn, the three ovals or circles are equal in size, rather than proportional to the dimensions that I put in. Is there a way to make them proportional?

    Reply
    • Hi Jim,

      Thanks for the question! Unfortunately, I don’t know by heart how to do this and a Google Search revealed that this is a bit tricky. I found this thread on Stack Overflow, which is discussing the topic.

      I hope that helps!

      Joachim

      Reply
  • Another thing, many journals want figures with sanserif fonts. Is there a way to change the font type of the numbers that are automatically displayed?

    Reply
    • Hi again 🙂

      I assume this should be possible by specifying the font options when exporting the figures (e.g. in the pdf() function). Have a look at this thread for more information.

      Regards,

      Joachim

      Reply
  • George Wasonga Alal
    March 21, 2021 5:22 pm

    Hello Joachim,
    How do I arrange a .csv file to draw a Venn diagram with multiple variables i.e.
    1. Classes of Bacteria in Tissues clone Libraries
    2. Classes of Bacteria in Water Clone Libraries and
    3. “Classes of bacteria shared between Tissue and water clone libraries”

    Reply
    • Hi George,

      I would calculate the number of cases in each of your groups using logical conditions. For example:

      nrow(data[data$class == "Tissues", ])

      The resulting number of cases would then be used as area values as explained in this tutorial.

      I hope that helps!

      Joachim

      Reply
  • George Wasonga Alal
    March 23, 2021 2:52 pm

    Hello Joachim
    Thanks for the help but if I have a data with many Row number but in three categories as stated above, how would you go about it? and these are in percentages

    I can send the data and you let me know how you go about it with stacking pie chats as per the example shown with many pie charts stacked on each other

    Reply
    • Hi George,

      You may send me a subsample of your data so that I can have a look. You can find my email contact on the about page.

      Regards

      Joachim

      Reply
  • Hello. What is the code to have two or more Venn diagram images on the same page (similar to the par function)?

    Reply
  • I have a question. I’m trying to make a Venn digram with nine sets but with the package just can do with five sets. Do you know how to make a nine-set Venn plot in R?

    Reply
  • Hello Joachim,
    Thanks for these nice tutorials! I need to make a Venn diagram with 26 different combinations (20 intersections) which is derived from 6 different options, are there any options within venndiagram package to let me build such a figure?

    Thanks

    Reply
  • Hi, thanks for the tutorial. Have you got one like this on how to make a Venn with 4 and 5 sets please? 🙂

    Reply
  • David Asare Kumi
    February 18, 2022 12:08 am

    Hi Joachim, I am most grateful. Your tutorial had been insightful.
    I would like to know if you can partition one set into three, say A, B, and C and in each you have a D as in the case of computing Bayes Theorem.
    Once again, I think you so very much for your good work.

    Reply
    • Hey David,

      Thank you very much for this wonderful feedback, glad you like my tutorials! 🙂

      Could you share an image that looks like the one you want to create?

      Regards,
      Joachim

      Reply
  • Dear Joachim Schork,
    Thank you for your step-by-step instruction.
    I am drawing a Venn diagram for three different sets of gene names, with VennDiagram Package.
    Do you know how I can get the lists of the overlapping gene names?

    Reply
    • Hey Paria,

      Thanks for the kind words, glad you like the tutorial!

      I think the easiest way to do this is to check those overlaps directly in your data set, and not based on the Venn Diagram.

      Could you share the structure of your data? What is returned when you run the following code?

      head(your_data)

      Regards,
      Joachim

      Reply
  • Hi Joachim,

    I am using the VennDiagram package and the diagram is fine. But I don’t know why the total numbers are not matching from the original datasets. Suppose, A=762 & B=641 $ overlapping is 222, then the unique numbers in A & B circles should be 540 and 419 respectively. But I am not sure why the unique circle in B gives 420, adding 1 extra. Please help me in resolving this issue. Thanks.

    Reply
  • How do you deal with (A U B U C)’ i.e. A union B union C complement???/

    Reply
  • I am struggling with R. So, can you help me get the right script? If I have an Excel file has five columns for females ( Female 1, Female 2, Female 3, Female 4, Female 5) and five columns for males (Male 1, Male 2, Male 3, Male 4, Male 5), can I get vann diagram from this data?

    Reply
    • Hello Tena,

      What do you have in each column?

      Regards,
      Cansu

      Reply
      • Thank you very much for your help.
        It is proteomic data for ten samples; we have more than 2000 proteins. So the amount of all protein for each sample is in each column. Also, there are common between males and females, and others are unique for each gender.

        Reply
        • Hello Tena,

          So each column represents a sample, and they are named Female1, Female2, etc. What do you want to show in your visualization? I am asking because when it comes to more than four groups, which is 10 in your case, things get complicated with Venn diagrams in R. Maybe we can use another visual that serves your purpose.

          Regards,
          Cansu

          Reply
  • I want to get the common between males and females and the unique quantity of proteins for males and females. If there is another option, please let me know about it. Have a great day

    Reply
    • Hello Tena,

      Alternatively, you can use stacked barplots or heatmaps. I will give you the barplot example. Please be aware that I labeled each count per gender per protein to obtain a visual comparable with Venn diagrams.

      # install.packages("tidyverse")  # Uncomment to install the package if you haven't already
      library(tidyverse)
       
      # Sample data
      set.seed(123) # for reproducibility
       
      Female1 <- sample(LETTERS[1:5], 20, replace = TRUE)
      Female2 <- sample(LETTERS[2:6], 20, replace = TRUE)
      Female3 <- sample(LETTERS[1:6], 20, replace = TRUE)
      Female4 <- sample(LETTERS[1:4], 20, replace = TRUE)
      Female5 <- sample(LETTERS[3:7], 20, replace = TRUE)
       
      Male1 <- sample(LETTERS[1:5], 20, replace = TRUE)
      Male2 <- sample(LETTERS[1:4], 20, replace = TRUE)
      Male3 <- sample(LETTERS[3:7], 20, replace = TRUE)
      Male4 <- sample(LETTERS[2:6], 20, replace = TRUE)
      Male5 <- sample(LETTERS[1:6], 20, replace = TRUE)
       
      df <- data.frame(Female1, Female2, Female3, Female4, Female5, Male1, Male2, Male3, Male4, Male5)
       
      # Convert to long format using tidyr's pivot_longer
      df_long <- df %>% 
        pivot_longer(everything(), names_to = "Group", values_to = "Protein")
       
      # Count occurrence of each protein in each group
      df_count <- df_long %>% 
        count(Group, Protein)
       
      # Create the plot
      ggplot(df_count, aes(x = Group, y = n, fill = Protein)) + 
        geom_bar(stat = "identity") +
        geom_text(aes(label = n), position = position_stack(vjust = 0.5)) +
        theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
        labs(x = "Group", y = "Count", fill = "Protein type")

       

      I hope you find the solution helpful.

      Regards,
      Cansu

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

Fill out this field
Fill out this field
Please enter a valid email address.

Top