2017-06-12 64 views

回答

0

無需改變整個內置R功能!對於基於plot函數的其他繪圖函數(例如,plot.ts()),這也是一個常見問題。

dotchart()調用之前只需使用par()

par(font.axis = 2, xaxt = "n") 
groups = factor(rep(1:2, times = c(10, 10))) 
dotchart(rnorm(20), groups = groups) 
0

尋找的dotchart函數內部,可以在最後的行看到axis(1)命令,增加了x軸的曲線圖。
一個簡單的解決方案是如下來創建dotchart函數的修改的拷貝:

mydotchart <- function (x, labels = NULL, groups = NULL, gdata = NULL, cex = par("cex"), 
    pt.cex = cex, pch = 21, gpch = 21, bg = par("bg"), color = par("fg"), 
    gcolor = par("fg"), lcolor = "gray", xlim = range(x[is.finite(x)]), 
    main = NULL, xlab = NULL, ylab = NULL, ...) 
{ 
    opar <- par("mai", "mar", "cex", "yaxs") 
    on.exit(par(opar)) 
    par(cex = cex, yaxs = "i") 
    if (!is.numeric(x)) 
     stop("'x' must be a numeric vector or matrix") 
    n <- length(x) 
    if (is.matrix(x)) { 
     if (is.null(labels)) 
      labels <- rownames(x) 
     if (is.null(labels)) 
      labels <- as.character(1L:nrow(x)) 
     labels <- rep_len(labels, n) 
     if (is.null(groups)) 
      groups <- col(x, as.factor = TRUE) 
     glabels <- levels(groups) 
    } 
    else { 
     if (is.null(labels)) 
      labels <- names(x) 
     glabels <- if (!is.null(groups)) 
      levels(groups) 
     if (!is.vector(x)) { 
      warning("'x' is neither a vector nor a matrix: using as.numeric(x)") 
      x <- as.numeric(x) 
     } 
    } 
    plot.new() 
    linch <- if (!is.null(labels)) 
     max(strwidth(labels, "inch"), na.rm = TRUE) 
    else 0 
    if (is.null(glabels)) { 
     ginch <- 0 
     goffset <- 0 
    } 
    else { 
     ginch <- max(strwidth(glabels, "inch"), na.rm = TRUE) 
     goffset <- 0.4 
    } 
    if (!(is.null(labels) && is.null(glabels))) { 
     nmai <- par("mai") 
     nmai[2L] <- nmai[4L] + max(linch + goffset, ginch) + 
      0.1 
     par(mai = nmai) 
    } 
    if (is.null(groups)) { 
     o <- 1L:n 
     y <- o 
     ylim <- c(0, n + 1) 
    } 
    else { 
     o <- sort.list(as.numeric(groups), decreasing = TRUE) 
     x <- x[o] 
     groups <- groups[o] 
     color <- rep_len(color, length(groups))[o] 
     lcolor <- rep_len(lcolor, length(groups))[o] 
     offset <- cumsum(c(0, diff(as.numeric(groups)) != 0)) 
     y <- 1L:n + 2 * offset 
     ylim <- range(0, y + 2) 
    } 
    plot.window(xlim = xlim, ylim = ylim, log = "") 
    lheight <- par("csi") 
    if (!is.null(labels)) { 
     linch <- max(strwidth(labels, "inch"), na.rm = TRUE) 
     loffset <- (linch + 0.1)/lheight 
     labs <- labels[o] 
     mtext(labs, side = 2, line = loffset, at = y, adj = 0, 
      col = color, las = 2, cex = cex, ...) 
    } 
    abline(h = y, lty = "dotted", col = lcolor) 
    points(x, y, pch = pch, col = color, bg = bg, cex = pt.cex/cex) 
    if (!is.null(groups)) { 
     gpos <- rev(cumsum(rev(tapply(groups, groups, length)) + 
      2) - 1) 
     ginch <- max(strwidth(glabels, "inch"), na.rm = TRUE) 
     goffset <- (max(linch + 0.2, ginch, na.rm = TRUE) + 0.1)/lheight 
     mtext(glabels, side = 2, line = goffset, at = gpos, adj = 0, 
      col = gcolor, las = 2, cex = cex, ...) 
     if (!is.null(gdata)) { 
      abline(h = gpos, lty = "dotted") 
      points(gdata, gpos, pch = gpch, col = gcolor, bg = bg, 
       cex = pt.cex/cex, ...) 
     } 
    } 
    # axis(1) 
    box() 
    title(main = main, xlab = xlab, ylab = ylab, ...) 
    invisible() 
} 

現在我們可以使用此功能:

set.seed(1) 
groups <- factor(rep(1:2, times = c(5, 15))) 
mydotchart(rnorm(20), groups = groups) 

和圖形是:

enter image description here

相關問題