R/size_n_color.R

# my_size_n_color.R -- adapted from package PLOTRIX

my_size_n_color <- function (x = NULL, y, size, sizefun = "sqrt", col, main = "", 
    xlim = NA, xlab = "", xat = NULL, xaxlab = NULL, xcex = 1, 
    xlas = 0, xgrid = FALSE, ylim = NA, ylab = "", yat = NULL, 
    yaxlab = NULL, ycex = 1, ylas = 1, ygrid = TRUE, mar = c(5, 
        4, 4, 2), boxit = TRUE, add = FALSE, border = NA, lwd=1, ...) 
{
    if (!is.na(sizefun)) 
        size <- do.call(sizefun, list(size))
    if (is.matrix(size)) {
        dimsize <- dim(size)
        if (is.null(x)) {
            x <- matrix(rep((1:dimsize[2]) * max(size * 2), each = dimsize[1]), 
                ncol = dimsize[2])
            y <- matrix(rep((dimsize[1]:1) * max(size * 2), dimsize[2]), 
                ncol = dimsize[2])
            if (is.null(xat)) 
                xat <- x[1, ]
            if (is.null(yat)) 
                yat <- y[, 1]
        }
        else {
            if (is.null(xat)) 
                xat <- 1:dimsize[2]
            if (is.null(yat)) 
                yat <- 1:dimsize[1]
        }
    }
    else {
        dimsize = c(length(size), 1)
        if (is.null(x)) 
            x <- 1:length(size)
    }
    xylim <- par("usr")
    aspect_ratio <- (xylim[2] - xylim[1])/(xylim[4] - xylim[3])
    maxsize <- max(size)
    if (is.na(xlim[1])) 
        xlim <- c(min(x) - maxsize * aspect_ratio, max(x) + maxsize * 
            aspect_ratio)
    if (is.na(ylim[1])) 
        ylim <- c(min(y) - maxsize/aspect_ratio, max(y) + maxsize/aspect_ratio)
    if (!add) {
        oldmar <- par(mar = mar)
        plot(x, y, main = main, xlab = xlab, ylab = ylab, xlim = xlim, 
            ylim = ylim, axes = FALSE, type = "n", ...)
    	xylim <- par("usr")
        if (xgrid) 
            segments(xat, xylim[3], xat, xylim[4], col = "lightgray", 
                lty = 2)
        if (ygrid) 
            segments(xylim[1], yat, xylim[2], yat, col = "lightgray", 
                lty = 2)
        axis(1, at = xat, labels = xaxlab, las = xlas, cex.axis = xcex)
        axis(2, at = yat, labels = yaxlab, las = ylas, cex.axis = ycex)
        if (boxit) 
            box()
    }
    if (is.matrix(size)) {
        if (is.null(dim(col))) 
            col = matrix(col, nrow = dimsize[1], ncol = dimsize[2])
        if (is.null(dim(border))) 
            border = matrix(border, nrow = dimsize[1], ncol = dimsize[2])
        for (row in 1:dimsize[1]) {
            for (column in 1:dimsize[2]) draw.circle(x[row, column], 
                y[row, column], size[row, column], border = border[row, column], 
                col = col[row, column], lwd=lwd)
        }
    }
    else {
        if (length(col) < length(size)) 
            col = rep(col, size)
        if (length(border) < length(size)) 
            border = rep(border, size)
        for (index in 1:length(size)) draw.circle(x[index], y[index], 
            size[index], border = border[index], col = col[index])
    }
    if (!add) 
        par(mar = oldmar)
}
robertdouglasmorrison/DuffyTools documentation built on April 16, 2024, 6:31 a.m.