Last active
August 27, 2020 08:42
-
-
Save mevers/9c846e6293db44dd37695c46b8f2b6a2 to your computer and use it in GitHub Desktop.
Modified limma::vennDiagram to remove box and add label
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| my.vennDiagram <- function (object, include = "both", names = NULL, mar = rep(1, | |
| 4), cex = c(1.5, 1, 0.7), lwd = 1, circle.col = NULL, counts.col = NULL, | |
| show.include = NULL, ...) | |
| { | |
| include <- as.character(include) | |
| LenInc <- min(length(include), 2) | |
| if (is(object, "VennCounts")) { | |
| include <- include[1] | |
| LenInc <- 1 | |
| } | |
| else { | |
| if (LenInc > 1) | |
| z2 <- vennCounts(object, include = include[2])[, | |
| "Counts"] | |
| object <- vennCounts(object, include = include[1]) | |
| } | |
| z <- object[, "Counts"] | |
| nsets <- ncol(object) - 1 | |
| if (nsets > 5) | |
| stop("Can't plot Venn diagram for more than 5 sets") | |
| VennZone <- object[, 1:nsets, drop = FALSE] | |
| VennZone <- apply(VennZone, 1, function(x) paste(x, sep = "", | |
| collapse = "")) | |
| names(z) <- VennZone | |
| if (length(include) == 2) | |
| names(z2) <- VennZone | |
| if (is.null(names)) | |
| names <- colnames(object)[1:nsets] | |
| FILL.COL <- TRUE | |
| if (is.null(circle.col)) { | |
| circle.col <- par("col") | |
| FILL.COL <- FALSE | |
| } | |
| if (length(circle.col) < nsets) | |
| circle.col <- rep(circle.col, length.out = nsets) | |
| if (is.null(counts.col)) | |
| counts.col <- par("col") | |
| if (length(counts.col) < LenInc) | |
| counts.col <- rep(counts.col, length.out = LenInc) | |
| if (is.null(show.include)) | |
| show.include <- as.logical(LenInc - 1) | |
| old.par <- par()$mar | |
| on.exit(par(mar = old.par)) | |
| par(mar = mar) | |
| if (nsets <= 3) { | |
| plot(x = 0, y = 0, type = "n", xlim = c(-4, 4), ylim = c(-4, | |
| 4), xlab = "", ylab = "", axes = FALSE, ...) | |
| theta <- 2 * pi * (0:360)/360 | |
| xcentres <- switch(nsets, 0, c(-1, 1), c(-1, 1, 0)) | |
| ycentres <- switch(nsets, 0, c(0, 0), c(1, 1, -2)/sqrt(3)) | |
| r <- 1.5 | |
| xtext <- switch(nsets, -1.2, c(-1.2, 1.2), c(-1.2, 1.2, | |
| 0)) | |
| ytext <- switch(nsets, 1.8, c(1.8, 1.8), c(2.4, 2.4, | |
| -3)) | |
| for (circle in 1:nsets) { | |
| if (!FILL.COL) | |
| lines(xcentres[circle] + r * cos(theta), ycentres[circle] + | |
| r * sin(theta), lwd = lwd, col = circle.col[circle]) | |
| if (FILL.COL) { | |
| RGB <- col2rgb(circle.col[circle])/255 | |
| ALPHA <- 0.06 | |
| RGB.ALP <- rgb(RGB[1, 1], RGB[2, 1], RGB[3, 1], | |
| alpha = ALPHA) | |
| polygon(xcentres[circle] + r * cos(theta), ycentres[circle] + | |
| r * sin(theta), border = circle.col[circle], | |
| lwd = lwd, col = RGB.ALP) | |
| } | |
| text(xtext[circle], ytext[circle], names[circle], | |
| cex = cex) | |
| } | |
| #switch(nsets, rect(-3, -2.5, 3, 2.5), rect(-3, -2.5, | |
| # 3, 2.5), rect(-3, -3.5, 3, 3.3)) | |
| showCounts <- switch(nsets, function(counts, cex, adj, | |
| col, leg) { | |
| text(2.3, -2.1, sprintf("Not in any = %i", counts[1]), cex = cex, col = col, | |
| adj = adj) | |
| text(0, 0, counts[2], cex = cex, col = col, adj = adj) | |
| if (show.include) text(-2.3, -2.1, leg, cex = cex, | |
| col = col, adj = adj) | |
| }, function(counts, cex, adj, col, leg) { | |
| text(2.3, -2.1, sprintf("Not in any = %i", counts[1]), cex = cex, col = col, | |
| adj = adj) | |
| text(1.5, 0.1, counts[2], cex = cex, col = col, adj = adj) | |
| text(-1.5, 0.1, counts[3], cex = cex, col = col, | |
| adj = adj) | |
| text(0, 0.1, counts[4], cex = cex, col = col, adj = adj) | |
| if (show.include) text(-2.3, -2.1, leg, cex = cex, | |
| col = col, adj = adj) | |
| }, function(counts, cex, adj, col, leg) { | |
| text(2.5, -3, sprintf("Not in any = %i", counts[1]), cex = cex, col = col, adj = adj) | |
| text(0, -1.7, counts[2], cex = cex, col = col, adj = adj) | |
| text(1.5, 1, counts[3], cex = cex, col = col, adj = adj) | |
| text(0.75, -0.35, counts[4], cex = cex, col = col, | |
| adj = adj) | |
| text(-1.5, 1, counts[5], cex = cex, col = col, adj = adj) | |
| text(-0.75, -0.35, counts[6], cex = cex, col = col, | |
| adj = adj) | |
| text(0, 0.9, counts[7], cex = cex, col = col, adj = adj) | |
| text(0, 0, counts[8], cex = cex, col = col, adj = adj) | |
| if (show.include) text(-2.5, -3, leg, cex = cex, | |
| col = col, adj = adj) | |
| }) | |
| if (LenInc == 1) | |
| adj <- c(0.5, 0.5) | |
| else adj <- c(0.5, 0) | |
| print(z) | |
| showCounts(counts = z, cex = cex[1], adj = adj, col = counts.col[1], | |
| leg = include[1]) | |
| if (LenInc == 2) | |
| showCounts(counts = z2, cex = cex[1], adj = c(0.5, | |
| 1), col = counts.col[2], leg = include[2]) | |
| return(invisible()) | |
| } | |
| plot(c(-20, 420), c(-20, 420), type = "n", axes = FALSE, | |
| ylab = "", xlab = "", ...) | |
| relocate_elp <- function(e, alpha, x, y) { | |
| phi <- (alpha/180) * pi | |
| xr <- e[, 1] * cos(phi) + e[, 2] * sin(phi) | |
| yr <- -e[, 1] * sin(phi) + e[, 2] * cos(phi) | |
| xr <- x + xr | |
| yr <- y + yr | |
| cbind(xr, yr) | |
| } | |
| if (4 == nsets) { | |
| #rect(-20, -20, 420, 400) | |
| elps <- cbind(162 * cos(seq(0, 2 * pi, len = 1000)), | |
| 108 * sin(seq(0, 2 * pi, len = 1000))) | |
| if (!FILL.COL) { | |
| polygon(relocate_elp(elps, 45, 130, 170), border = circle.col[1], | |
| lwd = lwd) | |
| polygon(relocate_elp(elps, 45, 200, 200), border = circle.col[2], | |
| lwd = lwd) | |
| polygon(relocate_elp(elps, 135, 200, 200), border = circle.col[3], | |
| lwd = lwd) | |
| polygon(relocate_elp(elps, 135, 270, 170), border = circle.col[4], | |
| lwd = lwd) | |
| } | |
| if (FILL.COL) { | |
| RGB <- col2rgb(circle.col)/255 | |
| ALPHA <- 0.06 | |
| RGB.ALP1 <- rgb(RGB[1, 1], RGB[2, 1], RGB[3, 1], | |
| alpha = ALPHA) | |
| RGB.ALP2 <- rgb(RGB[1, 2], RGB[2, 2], RGB[3, 2], | |
| alpha = ALPHA) | |
| RGB.ALP3 <- rgb(RGB[1, 3], RGB[2, 3], RGB[3, 3], | |
| alpha = ALPHA) | |
| RGB.ALP4 <- rgb(RGB[1, 4], RGB[2, 4], RGB[3, 4], | |
| alpha = ALPHA) | |
| polygon(relocate_elp(elps, 45, 130, 170), border = circle.col[1], | |
| lwd = lwd, col = RGB.ALP1) | |
| polygon(relocate_elp(elps, 45, 200, 200), border = circle.col[2], | |
| lwd = lwd, col = RGB.ALP2) | |
| polygon(relocate_elp(elps, 135, 200, 200), border = circle.col[3], | |
| lwd = lwd, col = RGB.ALP3) | |
| polygon(relocate_elp(elps, 135, 270, 170), border = circle.col[4], | |
| lwd = lwd, col = RGB.ALP4) | |
| } | |
| text(35, 315, names[1], cex = cex[1]) | |
| text(138, 350, names[2], cex = cex[1]) | |
| text(262, 347, names[3], cex = cex[1]) | |
| text(365, 315, names[4], cex = cex[1]) | |
| text(35, 250, z["1000"], cex = cex[2], col = counts.col[1], | |
| ) | |
| text(140, 315, z["0100"], cex = cex[2], col = counts.col[1]) | |
| text(260, 315, z["0010"], cex = cex[2], col = counts.col[1]) | |
| text(365, 250, z["0001"], cex = cex[2], col = counts.col[1]) | |
| text(90, 282, z["1100"], cex = cex[3], col = counts.col[1]) | |
| text(95, 110, z["1010"], cex = cex[2], col = counts.col[1]) | |
| text(200, 52, z["1001"], cex = cex[3], col = counts.col[1]) | |
| text(200, 292, z["0110"], cex = cex[2], col = counts.col[1]) | |
| text(300, 110, z["0101"], cex = cex[2], col = counts.col[1]) | |
| text(310, 282, z["0011"], cex = cex[3], col = counts.col[1]) | |
| text(130, 230, z["1110"], cex = cex[2], col = counts.col[1]) | |
| text(245, 81, z["1101"], cex = cex[3], col = counts.col[1]) | |
| text(155, 81, z["1011"], cex = cex[3], col = counts.col[1]) | |
| text(270, 230, z["0111"], cex = cex[2], col = counts.col[1]) | |
| text(200, 152, z["1111"], cex = cex[2], col = counts.col[1]) | |
| text(400, 15, sprintf("Not in any = %i", z["0000"]), cex = cex[1], col = counts.col[1]) | |
| if (length(include) == 2) { | |
| text(35, 238, z2["1000"], cex = cex[2], col = counts.col[2]) | |
| text(140, 304, z2["0100"], cex = cex[2], col = counts.col[2]) | |
| text(260, 304, z2["0010"], cex = cex[2], col = counts.col[2]) | |
| text(365, 238, z2["0001"], cex = cex[2], col = counts.col[2]) | |
| text(90, 274, z2["1100"], cex = cex[3], col = counts.col[2]) | |
| text(95, 100, z2["1010"], cex = cex[2], col = counts.col[2]) | |
| text(200, 43, z2["1001"], cex = cex[3], col = counts.col[2]) | |
| text(200, 280, z2["0110"], cex = cex[2], col = counts.col[2]) | |
| text(300, 100, z2["0101"], cex = cex[2], col = counts.col[2]) | |
| text(310, 274, z2["0011"], cex = cex[3], col = counts.col[2]) | |
| text(130, 219, z2["1110"], cex = cex[2], col = counts.col[2]) | |
| text(245, 71, z2["1101"], cex = cex[3], col = counts.col[2]) | |
| text(155, 72, z2["1011"], cex = cex[3], col = counts.col[2]) | |
| text(270, 219, z2["0111"], cex = cex[2], col = counts.col[2]) | |
| text(200, 140, z2["1111"], cex = cex[2], col = counts.col[2]) | |
| text(400, -2, sprintf("Not in any = %i", z2["0000"]), cex = cex[1], col = counts.col[2]) | |
| if (show.include) { | |
| text(10, 15, include[1], cex = cex[1], col = counts.col[1]) | |
| text(10, -2, include[2], cex = cex[1], col = counts.col[2]) | |
| } | |
| } | |
| return(invisible()) | |
| } | |
| #rect(-20, -30, 430, 430) | |
| elps <- cbind(150 * cos(seq(0, 2 * pi, len = 1000)), 60 * | |
| sin(seq(0, 2 * pi, len = 1000))) | |
| if (!FILL.COL) { | |
| polygon(relocate_elp(elps, 90, 200, 250), border = circle.col[1], | |
| lwd = lwd) | |
| polygon(relocate_elp(elps, 162, 250, 220), border = circle.col[2], | |
| lwd = lwd) | |
| polygon(relocate_elp(elps, 234, 250, 150), border = circle.col[3], | |
| lwd = lwd) | |
| polygon(relocate_elp(elps, 306, 180, 125), border = circle.col[4], | |
| lwd = lwd) | |
| polygon(relocate_elp(elps, 378, 145, 200), border = circle.col[5], | |
| lwd = lwd) | |
| } | |
| if (FILL.COL) { | |
| RGB <- col2rgb(circle.col)/255 | |
| ALPHA <- 0.06 | |
| RGB.ALP1 <- rgb(RGB[1, 1], RGB[2, 1], RGB[3, 1], alpha = ALPHA) | |
| RGB.ALP2 <- rgb(RGB[1, 2], RGB[2, 2], RGB[3, 2], alpha = ALPHA) | |
| RGB.ALP3 <- rgb(RGB[1, 3], RGB[2, 3], RGB[3, 3], alpha = ALPHA) | |
| RGB.ALP4 <- rgb(RGB[1, 4], RGB[2, 4], RGB[3, 4], alpha = ALPHA) | |
| RGB.ALP5 <- rgb(RGB[1, 5], RGB[2, 5], RGB[3, 5], alpha = ALPHA) | |
| polygon(relocate_elp(elps, 90, 200, 250), border = circle.col[1], | |
| lwd = lwd, col = RGB.ALP1) | |
| polygon(relocate_elp(elps, 162, 250, 220), border = circle.col[2], | |
| lwd = lwd, col = RGB.ALP2) | |
| polygon(relocate_elp(elps, 234, 250, 150), border = circle.col[3], | |
| lwd = lwd, col = RGB.ALP3) | |
| polygon(relocate_elp(elps, 306, 180, 125), border = circle.col[4], | |
| lwd = lwd, col = RGB.ALP4) | |
| polygon(relocate_elp(elps, 378, 145, 200), border = circle.col[5], | |
| lwd = lwd, col = RGB.ALP5) | |
| } | |
| text(50, 285, names[1], cex = cex[1]) | |
| text(200, 415, names[2], cex = cex[1]) | |
| text(350, 305, names[3], cex = cex[1]) | |
| text(350, 20, names[4], cex = cex[1]) | |
| text(100, -10, names[5], cex = cex[1]) | |
| text(61, 231, z["10000"], cex = cex[2], col = counts.col[1]) | |
| text(200, 332, z["01000"], cex = cex[2], col = counts.col[1]) | |
| text(321, 248, z["00100"], cex = cex[2], col = counts.col[1]) | |
| text(290, 84, z["00010"], cex = cex[2], col = counts.col[1]) | |
| text(132, 72, z["00001"], cex = cex[2], col = counts.col[1]) | |
| text(146, 253, z["11000"], cex = cex[3], col = counts.col[1]) | |
| text(123, 191, z["10100"], cex = cex[3], col = counts.col[1]) | |
| text(275, 155, z["10010"], cex = cex[3], col = counts.col[1]) | |
| text(137, 149, z["10001"], cex = cex[3], col = counts.col[1]) | |
| text(243, 271, z["01100"], cex = cex[3], col = counts.col[1]) | |
| text(175, 270, z["01010"], cex = cex[3], col = counts.col[1]) | |
| text(187, 120, z["01001"], cex = cex[3], col = counts.col[1]) | |
| text(286, 193, z["00110"], cex = cex[3], col = counts.col[1]) | |
| text(267, 238, z["00101"], cex = cex[3], col = counts.col[1]) | |
| text(228, 108, z["00011"], cex = cex[3], col = counts.col[1]) | |
| text(148, 213, z["11100"], cex = cex[3], col = counts.col[1]) | |
| text(159, 255, z["11010"], cex = cex[3], col = counts.col[1]) | |
| text(171, 144, z["11001"], cex = cex[3], col = counts.col[1]) | |
| text(281, 178, z["10110"], cex = cex[3], col = counts.col[1]) | |
| text(143, 166, z["10101"], cex = cex[3], col = counts.col[1]) | |
| text(252, 148, z["10011"], cex = cex[3], col = counts.col[1]) | |
| text(205, 258, z["01110"], cex = cex[3], col = counts.col[1]) | |
| text(254, 248, z["01101"], cex = cex[3], col = counts.col[1]) | |
| text(211, 121, z["01011"], cex = cex[3], col = counts.col[1]) | |
| text(267, 214, z["00111"], cex = cex[3], col = counts.col[1]) | |
| text(170, 234, z["11110"], cex = cex[3], col = counts.col[1]) | |
| text(158, 172, z["11101"], cex = cex[3], col = counts.col[1]) | |
| text(212, 142, z["11011"], cex = cex[3], col = counts.col[1]) | |
| text(263, 183, z["10111"], cex = cex[3], col = counts.col[1]) | |
| text(239, 235, z["01111"], cex = cex[3], col = counts.col[1]) | |
| text(204, 193, z["11111"], cex = cex[2], col = counts.col[1]) | |
| text(400, 7, sprintf("Not in any = %i", z["00000"]), cex = cex[1], col = counts.col[1]) | |
| if (length(include) == 2) { | |
| text(61, 220, z2["10000"], cex = cex[2], col = counts.col[2]) | |
| text(200, 321, z2["01000"], cex = cex[2], col = counts.col[2]) | |
| text(321, 237, z2["00100"], cex = cex[2], col = counts.col[2]) | |
| text(290, 73, z2["00010"], cex = cex[2], col = counts.col[2]) | |
| text(132, 61, z2["00001"], cex = cex[2], col = counts.col[2]) | |
| text(146, 244, z2["11000"], cex = cex[3], col = counts.col[2]) | |
| text(123, 180, z2["10100"], cex = cex[3], col = counts.col[2]) | |
| text(275, 144, z2["10010"], cex = cex[3], col = counts.col[2]) | |
| text(137, 143, z2["10001"], cex = cex[3], col = counts.col[2]) | |
| text(243, 260, z2["01100"], cex = cex[3], col = counts.col[2]) | |
| text(175, 259, z2["01010"], cex = cex[3], col = counts.col[2]) | |
| text(187, 110, z2["01001"], cex = cex[3], col = counts.col[2]) | |
| text(286, 186, z2["00110"], cex = cex[3], col = counts.col[2]) | |
| text(267, 230, z2["00101"], cex = cex[3], col = counts.col[2]) | |
| text(228, 97, z2["00011"], cex = cex[3], col = counts.col[2]) | |
| text(148, 203, z2["11100"], cex = cex[3], col = counts.col[2]) | |
| text(159, 249, z2["11010"], cex = cex[3], col = counts.col[2]) | |
| text(171, 137, z2["11001"], cex = cex[3], col = counts.col[2]) | |
| text(281, 171, z2["10110"], cex = cex[3], col = counts.col[2]) | |
| text(143, 155, z2["10101"], cex = cex[3], col = counts.col[2]) | |
| text(252, 137, z2["10011"], cex = cex[3], col = counts.col[2]) | |
| text(205, 247, z2["01110"], cex = cex[3], col = counts.col[2]) | |
| text(254, 242, z2["01101"], cex = cex[3], col = counts.col[2]) | |
| text(211, 112, z2["01011"], cex = cex[3], col = counts.col[2]) | |
| text(267, 207, z2["00111"], cex = cex[3], col = counts.col[2]) | |
| text(170, 223, z2["11110"], cex = cex[3], col = counts.col[2]) | |
| text(158, 162, z2["11101"], cex = cex[3], col = counts.col[2]) | |
| text(212, 133, z2["11011"], cex = cex[3], col = counts.col[2]) | |
| text(263, 172, z2["10111"], cex = cex[3], col = counts.col[2]) | |
| text(239, 228, z2["01111"], cex = cex[3], col = counts.col[2]) | |
| text(204, 182, z2["11111"], cex = cex[2], col = counts.col[2]) | |
| text(400, -10, sprintf("Not in any = %i", z2["00000"]), cex = cex[1], col = counts.col[2]) | |
| if (show.include) { | |
| text(10, 7, include[1], cex = cex[1], col = counts.col[1]) | |
| text(10, -10, include[2], cex = cex[1], col = counts.col[2]) | |
| } | |
| } | |
| invisible() | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment