2016-06-25 9 views
0

Ich verwende biwavelet Paket Wavelet-Analyse durchzuführen. Wenn ich jedoch die Etikettengröße für die Achse unter Verwendung von anpassen möchte, ändert sich die Etikettengröße nicht. Auf der anderen Seite funktionieren cex.lab und cex.main gut. Ist das ein Fehler? Das folgende gibt ein reproduzierbares Beispiel.biwavelet-Paket: "cex.axis" funktioniert nicht in plot.biwavelet(); Ein Käfer?

library(biwavelet) 
t1 <- cbind(1:100, rnorm(100)) 
t2 <- cbind(1:100, rnorm(100)) 
# Continuous wavelet transform 
wt.t1 <- wt(t1) 
par(oma = c(0, 0.5, 0, 0), mar = c(4, 2, 2, 4)) 
plot(wt.t1,plot.cb = T,plot.phase = T,type = 'power.norm', 
xlab = 'Time(year)',ylab = 'Period(year)',mgp=c(2,1,0), 
main='Winter station 1',cex.main=0.8,cex.lab=0.8,cex.axis=0.8) 

bearbeiten

Es gab eine vorherige Frage auf dieser Seite vor einem Monat: Wavelets plot: changing x-, y- axis, and color plot, aber nicht gelöst. Irgendeine Hilfe diesmal? Vielen Dank!

Antwort

4

Ja, es ist ein Fehler. Hier ist die gepatchte Version: my.plot.biwavelet()

Diese Version akzeptiert das Argument (standardmäßig 1), und Sie können es bei Bedarf ändern. Ich werde Ihnen kurz erklären, was das Problem ist, im Abschnitt "Erklärung" am Ende.

my.plot.biwavelet <- function (x, ncol = 64, fill.cols = NULL, xlab = "Time", ylab = "Period", 
    tol = 1, plot.cb = FALSE, plot.phase = FALSE, type = "power.corr.norm", 
    plot.coi = TRUE, lwd.coi = 1, col.coi = "white", lty.coi = 1, 
    alpha.coi = 0.5, plot.sig = TRUE, lwd.sig = 4, col.sig = "black", 
    lty.sig = 1, bw = FALSE, legend.loc = NULL, legend.horiz = FALSE, 
    arrow.len = min(par()$pin[2]/30, par()$pin[1]/40), arrow.lwd = arrow.len * 
     0.3, arrow.cutoff = 0.9, arrow.col = "black", xlim = NULL, 
    ylim = NULL, zlim = NULL, xaxt = "s", yaxt = "s", form = "%Y", cex.axis = 1, 
    ...) { 
     if (is.null(fill.cols)) { 
      if (bw) { 
       fill.cols <- c("black", "white") 
      } 
      else { 
       fill.cols <- c("#00007F", "blue", "#007FFF", 
        "cyan", "#7FFF7F", "yellow", "#FF7F00", "red", 
        "#7F0000") 
      } 
     } 
     col.pal <- colorRampPalette(fill.cols) 
     fill.colors <- col.pal(ncol) 
     types <- c("power.corr.norm", "power.corr", "power.norm", 
      "power", "wavelet", "phase") 
     type <- match.arg(tolower(type), types) 
     if (type == "power.corr" | type == "power.corr.norm") { 
      if (x$type == "wtc" | x$type == "xwt") { 
       x$power <- x$power.corr 
       x$wave <- x$wave.corr 
      } 
      else { 
       x$power <- x$power.corr 
      } 
     } 
     if (type == "power.norm" | type == "power.corr.norm") { 
      if (x$type == "xwt") { 
       zvals <- log2(x$power)/(x$d1.sigma * x$d2.sigma) 
       if (is.null(zlim)) { 
        zlim <- range(c(-1, 1) * max(zvals)) 
       } 
       zvals[zvals < zlim[1]] <- zlim[1] 
       locs <- pretty(range(zlim), n = 5) 
       leg.lab <- 2^locs 
      } 
      else if (x$type == "wtc" | x$type == "pwtc") { 
       zvals <- x$rsq 
       zvals[!is.finite(zvals)] <- NA 
       if (is.null(zlim)) { 
        zlim <- range(zvals, na.rm = TRUE) 
       } 
       zvals[zvals < zlim[1]] <- zlim[1] 
       locs <- pretty(range(zlim), n = 5) 
       leg.lab <- locs 
      } 
      else { 
       zvals <- log2(abs(x$power/x$sigma2)) 
       if (is.null(zlim)) { 
        zlim <- range(c(-1, 1) * max(zvals)) 
       } 
       zvals[zvals < zlim[1]] <- zlim[1] 
       locs <- pretty(range(zlim), n = 5) 
       leg.lab <- 2^locs 
      } 
     } 
     else if (type == "power" | type == "power.corr") { 
      zvals <- log2(x$power) 
      if (is.null(zlim)) { 
       zlim <- range(c(-1, 1) * max(zvals)) 
      } 
      zvals[zvals < zlim[1]] <- zlim[1] 
      locs <- pretty(range(zlim), n = 5) 
      leg.lab <- 2^locs 
     } 
     else if (type == "wavelet") { 
      zvals <- (Re(x$wave)) 
      if (is.null(zlim)) { 
       zlim <- range(zvals) 
      } 
      locs <- pretty(range(zlim), n = 5) 
      leg.lab <- locs 
     } 
     else if (type == "phase") { 
      zvals <- x$phase 
      if (is.null(zlim)) { 
       zlim <- c(-pi, pi) 
      } 
      locs <- pretty(range(zlim), n = 5) 
      leg.lab <- locs 
     } 
     if (is.null(xlim)) { 
      xlim <- range(x$t) 
     } 
     yvals <- log2(x$period) 
     if (is.null(ylim)) { 
      ylim <- range(yvals) 
     } 
     else { 
      ylim <- log2(ylim) 
     } 
     image(x$t, yvals, t(zvals), zlim = zlim, xlim = xlim, 
      ylim = rev(ylim), xlab = xlab, ylab = ylab, yaxt = "n", 
      xaxt = "n", col = fill.colors, ...) 
     box() 
     if (class(x$xaxis)[1] == "Date" | class(x$xaxis)[1] == 
       "POSIXct") { 
      if (xaxt != "n") { 
        xlocs <- pretty(x$t) + 1 
       axis(side = 1, at = xlocs, labels = format(x$xaxis[xlocs], 
        form)) 
      } 
      } 
     else { 
       if (xaxt != "n") { 
       xlocs <- axTicks(1) 
       axis(side = 1, at = xlocs, cex.axis = cex.axis) 
      } 
     } 
     if (yaxt != "n") { 
      axis.locs <- axTicks(2) 
      yticklab <- format(2^axis.locs, dig = 1) 
      axis(2, at = axis.locs, labels = yticklab, cex.axis = cex.axis) 
     } 
     if (plot.coi) { 
      polygon(x = c(x$t, rev(x$t)), lty = lty.coi, lwd = lwd.coi, 
        y = c(log2(x$coi), rep(max(log2(x$coi), na.rm = TRUE), 
        length(x$coi))), col = adjustcolor(col.coi, 
        alpha.f = alpha.coi), border = col.coi) 
     } 
     if (plot.sig & length(x$signif) > 1) { 
      if (x$type %in% c("wt", "xwt")) { 
       contour(x$t, yvals, t(x$signif), level = tol, 
        col = col.sig, lwd = lwd.sig, add = TRUE, drawlabels = FALSE) 
       } 
      else { 
       tmp <- x$rsq/x$signif 
       contour(x$t, yvals, t(tmp), level = tol, col = col.sig, 
        lwd = lwd.sig, add = TRUE, drawlabels = FALSE) 
      } 
     } 
     if (plot.phase) { 
      a <- x$phase 
      locs.phases <- which(zvals < quantile(zvals, arrow.cutoff)) 
      a[locs.phases] <- NA 
       phase.plot(x$t, log2(x$period), a, arrow.len = arrow.len, 
       arrow.lwd = arrow.lwd, arrow.col = arrow.col) 
     } 
      box() 
      if (plot.cb) { 
       fields::image.plot(x$t, yvals, t(zvals), zlim = zlim, ylim = rev(range(yvals)), 
        xlab = xlab, ylab = ylab, col = fill.colors, 
       smallplot = legend.loc, horizontal = legend.horiz, 
       legend.only = TRUE, axis.args = list(at = locs, 
        labels = format(leg.lab, dig = 2)), xpd = NA) 
     } 
    } 

-Test

library(biwavelet) 
t1 <- cbind(1:100, rnorm(100)) 
t2 <- cbind(1:100, rnorm(100)) 
# Continuous wavelet transform 
wt.t1 <- wt(t1) 
par(oma = c(0, 0.5, 0, 0), mar = c(4, 2, 2, 4)) 
my.plot.biwavelet(wt.t1,plot.cb = T,plot.phase = T,type = 'power.norm', 
    xlab = 'Time(year)',ylab = 'Period(year)',mgp=c(2,1,0), 
    main='Winter station 1',cex.main=0.8,cex.lab=0.8,cex.axis=0.8) 

Wie erwartet, ist es funktioniert.

nice


Erklärung

In plot.biwavelet(), warum cex.axis über ... vorbei funktioniert nicht?

plot.biwavelet() erzeugt das Ihre endgültige Stück hauptsächlich in 3 Stufen:

  1. image(..., xaxt = "n", yaxt = "n") Grundstück zu erzeugen;
  2. axis(1, at = atTicks(1)); axis(2, at = atTicks(2)) zum Hinzufügen einer Achse;
  3. fields::image.plot() für die Anzeige von Farbe Legende Streifen.

Nun, obwohl diese Funktion ... nimmt, werden sie nur auf den ersten image() Anruf zugeführt, während die folgende axis(), (einschließlich polygon(), contour(), phase.plot()) und image.plot() keine nehmen von .... Beim späteren Aufruf von axis() wird keine flexible Spezifikation in Bezug auf die Achsensteuerung unterstützt.

Ich denke, während der Entwicklung des Pakets wurde das Problem beschrieben in: Giving arguments from “…” argument to right function in R aufgetreten. Vielleicht hat der Autor dieses potenzielle Problem nicht erkannt und hier einen Fehler hinterlassen. Meine Antwort auf diesen Beitrag sowie Rolands Kommentare weisen auf eine robuste Lösung hin.

Ich bin nicht der Paket-Autor so kann nicht entscheiden, wie er das beheben wird. Meine Lösung ist brutal, aber funktioniert für Sie vorübergehend: Fügen Sie einfach das Argument zu axis() Anruf hinzu.Ich habe Tarik (Paketautor) mit einer E-Mail erreicht, und ich glaube, er wird Ihnen eine viel bessere Erklärung und Lösung geben.

+0

Lieber Li, Sie sind wirklich ein Meister in R. Vielen Dank für Ihre Hilfe und ich schätze Ihre freundliche Hilfe. –

+0

Lieber Li, ich bin neu bei StackOverflow und habe Ihre Antwort gerade angenommen. Ich frage mich, wie kann ich deine Antwort "abstimmen"? Vielen Dank. –

+0

Lieber Li, ich habe gerade gelernt, eine Antwort auf Google zu wählen. Nochmals vielen Dank für Ihre freundliche Hilfe. –

1

Dieses Problem wurde behoben, indem das ...-Argument an axis in plot.biwavelet übergeben wurde. Ihr Code sollte nun wie gewünscht funktionieren. Beachten Sie, dass Änderungen an und anderen axis-Argumenten alle drei Achsen (x, y, z) betreffen.

können Sie die neue Version herunterladen (0.20.8) von biwavelet von GitHub indem Sie den folgenden Befehl an der R Konsole Ausgabe (dies setzt voraus, dass Sie das Paket devtools bereits installiert haben): devtools::install_github("tgouhier/biwavelet")

Dank für den Hinweis auf der Fehler!

+0

Sie sind erstaunlich! Es funktioniert jetzt. Vielen Dank für Ihre freundliche Hilfe. –