2016-04-22 6 views
0

Ich versuche, den Titel meiner Legende in eine "zentrierte" Position mit title.adj für X-und Y-Richtung. Der Titel wird jedoch zweimal angezeigt (einmal in korrekter Position und einmal in falscher x-Position). Kann mir bitte jemand helfen, den zweiten "falschen" Titel zu entfernen? Hier ist ein Beispiel:Position des Titels in einer Legende mit title.adj

plot(c(1,2), pch=20) 
legend("topleft", legend="text", pch=20, col="red", title="double-title", title.adj=c(0.4, 0.2)) 
+0

Argument 'title.adj =' nur horizontal einstellen - wenn Sie zwei Werte geben, Titel wiederholt. –

+0

Gibt es eine Möglichkeit, die vertikale Position einzustellen? – Sarah

Antwort

1

Titel Einstellung nur horizontal arbeitet, aber es gibt nichts, was Sie stoppen aus der eigenen Legende Funktion zu schaffen, wenn Sie das wirklich brauchen. Ich habe legend.enhanced erstellt, die als ein Zwei-Vektor-Array akzeptiert.

Musterausgänge - erste Säule ist die ursprüngliche legend, zweite Spalte ist die legend.enhanced - die rechte untere Bild ist das, was Sie wollen - es passt sich den Titel von bestimmten X und Y Werte. (zweite Option wäre, die Legende manuell selbst zu zeichnen).

par(mfrow=c(2,2)) 

plot(c(1,2), pch=20) 
legend("topleft", legend="text", pch=20, col="red", title="double-title A B C", 
     title.adj=c(0.4)) 

plot(c(1,2), pch=20) 
legend.enhanced("topleft", legend="text", pch=20, col="red", title="double-title A B C", 
     title.adj=c(0.4)) 


plot(c(1,2), pch=20) 
legend("topleft", legend="text", pch=20, col="red", title="double-title A B C", 
     title.adj=c(0.4,0.5)) 

plot(c(1,2), pch=20) 
legend.enhanced("topleft", legend="text", pch=20, col="red", title="double-title A B C", 
       title.adj=c(0.4,1)) 

produzieren eine Stellplätze:

enter image description here

Code:

legend.enhanced <- function (x, y = NULL, legend, fill = NULL, col = par("col"), 
      border = "black", lty, lwd, pch, angle = 45, density = NULL, 
      bty = "o", bg = par("bg"), box.lwd = par("lwd"), box.lty = par("lty"), 
      box.col = par("fg"), pt.bg = NA, cex = 1, pt.cex = cex, 
      pt.lwd = lwd, xjust = 0, yjust = 1, x.intersp = 1, y.intersp = 1, 
      adj = c(0, 0.5), text.width = NULL, text.col = par("col"), 
      text.font = NULL, merge = do.lines && has.pch, trace = FALSE, 
      plot = TRUE, ncol = 1, horiz = FALSE, title = NULL, inset = 0, 
      xpd, title.col = text.col, title.adj = c(0.5,0), seg.len = 2) 
{ 
    if (missing(legend) && !missing(y) && (is.character(y) || 
             is.expression(y))) { 
    legend <- y 
    y <- NULL 
    } 
    mfill <- !missing(fill) || !missing(density) 
    if (!missing(xpd)) { 
    op <- par("xpd") 
    on.exit(par(xpd = op)) 
    par(xpd = xpd) 
    } 
    title <- as.graphicsAnnot(title) 
    if (length(title) > 1) 
    stop("invalid 'title'") 
    legend <- as.graphicsAnnot(legend) 
    n.leg <- if (is.call(legend)) 
    1 
    else length(legend) 
    if (n.leg == 0) 
    stop("'legend' is of length 0") 
    auto <- if (is.character(x)) 
    match.arg(x, c("bottomright", "bottom", "bottomleft", 
        "left", "topleft", "top", "topright", "right", "center")) 
    else NA 
    if (is.na(auto)) { 
    xy <- xy.coords(x, y) 
    x <- xy$x 
    y <- xy$y 
    nx <- length(x) 
    if (nx < 1 || nx > 2) 
     stop("invalid coordinate lengths") 
    } 
    else nx <- 0 
    xlog <- par("xlog") 
    ylog <- par("ylog") 
    rect2 <- function(left, top, dx, dy, density = NULL, angle, 
        ...) { 
    r <- left + dx 
    if (xlog) { 
     left <- 10^left 
     r <- 10^r 
    } 
    b <- top - dy 
    if (ylog) { 
     top <- 10^top 
     b <- 10^b 
    } 
    rect(left, top, r, b, angle = angle, density = density, 
     ...) 
    } 
    segments2 <- function(x1, y1, dx, dy, ...) { 
    x2 <- x1 + dx 
    if (xlog) { 
     x1 <- 10^x1 
     x2 <- 10^x2 
    } 
    y2 <- y1 + dy 
    if (ylog) { 
     y1 <- 10^y1 
     y2 <- 10^y2 
    } 
    segments(x1, y1, x2, y2, ...) 
    } 
    points2 <- function(x, y, ...) { 
    if (xlog) 
     x <- 10^x 
    if (ylog) 
     y <- 10^y 
    points(x, y, ...) 
    } 
    text2 <- function(x, y, ...) { 
    if (xlog) 
     x <- 10^x 
    if (ylog) 
     y <- 10^y 
    text(x, y, ...) 
    } 
    if (trace) 
    catn <- function(...) do.call("cat", c(lapply(list(...), 
                formatC), list("\n"))) 
    cin <- par("cin") 
    Cex <- cex * par("cex") 
    if (is.null(text.width)) 
    text.width <- max(abs(strwidth(legend, units = "user", 
            cex = cex, font = text.font))) 
    else if (!is.numeric(text.width) || text.width < 0) 
    stop("'text.width' must be numeric, >= 0") 
    xc <- Cex * xinch(cin[1L], warn.log = FALSE) 
    yc <- Cex * yinch(cin[2L], warn.log = FALSE) 
    if (xc < 0) 
    text.width <- -text.width 
    xchar <- xc 
    xextra <- 0 
    yextra <- yc * (y.intersp - 1) 
    ymax <- yc * max(1, strheight(legend, units = "user", cex = cex)/yc) 
    ychar <- yextra + ymax 
    if (trace) 
    catn(" xchar=", xchar, "; (yextra,ychar)=", c(yextra, 
                ychar)) 
    if (mfill) { 
    xbox <- xc * 0.8 
    ybox <- yc * 0.5 
    dx.fill <- xbox 
    } 
    do.lines <- (!missing(lty) && (is.character(lty) || any(lty > 
                  0))) || !missing(lwd) 
    n.legpercol <- if (horiz) { 
    if (ncol != 1) 
     warning(gettextf("horizontal specification overrides: Number of columns := %d", 
         n.leg), domain = NA) 
    ncol <- n.leg 
    1 
    } 
    else ceiling(n.leg/ncol) 
    has.pch <- !missing(pch) && length(pch) > 0 
    if (do.lines) { 
    x.off <- if (merge) 
     -0.7 
    else 0 
    } 
    else if (merge) 
    warning("'merge = TRUE' has no effect when no line segments are drawn") 
    if (has.pch) { 
    if (is.character(pch) && !is.na(pch[1L]) && nchar(pch[1L], 
                 type = "c") > 1) { 
     if (length(pch) > 1) 
     warning("not using pch[2..] since pch[1L] has multiple chars") 
     np <- nchar(pch[1L], type = "c") 
     pch <- substr(rep.int(pch[1L], np), 1L:np, 1L:np) 
    } 
    if (!is.character(pch)) 
     pch <- as.integer(pch) 
    } 
    if (is.na(auto)) { 
    if (xlog) 
     x <- log10(x) 
    if (ylog) 
     y <- log10(y) 
    } 
    if (nx == 2) { 
    x <- sort(x) 
    y <- sort(y) 
    left <- x[1L] 
    top <- y[2L] 
    w <- diff(x) 
    h <- diff(y) 
    w0 <- w/ncol 
    x <- mean(x) 
    y <- mean(y) 
    if (missing(xjust)) 
     xjust <- 0.5 
    if (missing(yjust)) 
     yjust <- 0.5 
    } 
    else { 
    h <- (n.legpercol + (!is.null(title))) * ychar + yc 
    w0 <- text.width + (x.intersp + 1) * xchar 
    if (mfill) 
     w0 <- w0 + dx.fill 
    if (do.lines) 
     w0 <- w0 + (seg.len + x.off) * xchar 
    w <- ncol * w0 + 0.5 * xchar 
    if (!is.null(title) && (abs(tw <- strwidth(title, units = "user", 
               cex = cex) + 0.5 * xchar)) > abs(w)) { 
     xextra <- (tw - w)/2 
     w <- tw 
    } 
    if (is.na(auto)) { 
     left <- x - xjust * w 
     top <- y + (1 - yjust) * h 
    } 
    else { 
     usr <- par("usr") 
     inset <- rep_len(inset, 2) 
     insetx <- inset[1L] * (usr[2L] - usr[1L]) 
     left <- switch(auto, bottomright = , topright = , 
        right = usr[2L] - w - insetx, bottomleft = , 
        left = , topleft = usr[1L] + insetx, bottom = , 
        top = , center = (usr[1L] + usr[2L] - w)/2) 
     insety <- inset[2L] * (usr[4L] - usr[3L]) 
     top <- switch(auto, bottomright = , bottom = , bottomleft = usr[3L] + 
         h + insety, topleft = , top = , topright = usr[4L] - 
         insety, left = , right = , center = (usr[3L] + 
                  usr[4L] + h)/2) 
    } 
    } 
    if (plot && bty != "n") { 
    if (trace) 
     catn(" rect2(", left, ",", top, ", w=", w, ", h=", 
      h, ", ...)", sep = "") 
    rect2(left, top, dx = w, dy = h, col = bg, density = NULL, 
      lwd = box.lwd, lty = box.lty, border = box.col) 
    } 
    xt <- left + xchar + xextra + (w0 * rep.int(0:(ncol - 1), 
               rep.int(n.legpercol, ncol)))[1L:n.leg] 
    yt <- top - 0.5 * yextra - ymax - (rep.int(1L:n.legpercol, 
              ncol)[1L:n.leg] - 1 + (!is.null(title))) * ychar 
    if (mfill) { 
    if (plot) { 
     if (!is.null(fill)) 
     fill <- rep_len(fill, n.leg) 
     rect2(left = xt, top = yt + ybox/2, dx = xbox, dy = ybox, 
      col = fill, density = density, angle = angle, 
      border = border) 
    } 
    xt <- xt + dx.fill 
    } 
    if (plot && (has.pch || do.lines)) 
    col <- rep_len(col, n.leg) 
    if (missing(lwd) || is.null(lwd)) 
    lwd <- par("lwd") 
    if (do.lines) { 
    if (missing(lty) || is.null(lty)) 
     lty <- 1 
    lty <- rep_len(lty, n.leg) 
    lwd <- rep_len(lwd, n.leg) 
    ok.l <- !is.na(lty) & (is.character(lty) | lty > 0) & 
     !is.na(lwd) 
    if (trace) 
     catn(" segments2(", xt[ok.l] + x.off * xchar, ",", 
      yt[ok.l], ", dx=", seg.len * xchar, ", dy=0, ...)") 
    if (plot) 
     segments2(xt[ok.l] + x.off * xchar, yt[ok.l], dx = seg.len * 
        xchar, dy = 0, lty = lty[ok.l], lwd = lwd[ok.l], 
       col = col[ok.l]) 
    xt <- xt + (seg.len + x.off) * xchar 
    } 
    if (has.pch) { 
    pch <- rep_len(pch, n.leg) 
    pt.bg <- rep_len(pt.bg, n.leg) 
    pt.cex <- rep_len(pt.cex, n.leg) 
    pt.lwd <- rep_len(pt.lwd, n.leg) 
    ok <- !is.na(pch) 
    if (!is.character(pch)) { 
     ok <- ok & (pch >= 0 | pch <= -32) 
    } 
    else { 
     ok <- ok & nzchar(pch) 
    } 
    x1 <- (if (merge && do.lines) 
     xt - (seg.len/2) * xchar 
     else xt)[ok] 
    y1 <- yt[ok] 
    if (trace) 
     catn(" points2(", x1, ",", y1, ", pch=", pch[ok], 
      ", ...)") 
    if (plot) 
     points2(x1, y1, pch = pch[ok], col = col[ok], cex = pt.cex[ok], 
       bg = pt.bg[ok], lwd = pt.lwd[ok]) 
    } 
    xt <- xt + x.intersp * xchar 
    if (plot) { 
    if (is.na(title.adj[2])) { title.adj[2] <- 0} 
    if (!is.null(title)) 
     text2(left + w * title.adj[1], top - ymax, labels = title, 
      adj = c(title.adj[1], title.adj[2]), cex = cex, col = title.col) 
    text2(xt, yt, labels = legend, adj = adj, cex = cex, 
      col = text.col, font = text.font) 
    } 
    invisible(list(rect = list(w = w, h = h, left = left, top = top), 
       text = list(x = xt, y = yt))) 
} 
+0

Perfekt, danke !! – Sarah