2

我正在使用孤立的 R 库(wmtsa)。它的一个函数创建了一个连续的小波变换 ( wavCWT()),它返回一个小波对象,并且可以通过调用传统plot()函数来绘制它。不幸的是,函数的编写方式不允许我更改一些典型的绘图参数。特别是,我无法设置axes=F,我不得不一直绘制轴。这没有帮助,因为我想向我的设备添加额外的层,并且轴不同并且它们是偏移的。

有没有办法将参数传递给调用 plot() 函数的方法?

如果这不可能,恐怕我将不得不修改源代码。如果是这种情况,我应该去哪里修改这种对象的方法?

我找到了方法的来源,但我的黑客技能有限,我有点迷茫。

例子:

 library(wmtsa)   # assuming you have installed the package wmtsa
 wavCWT(sin(rnorm(1000)))
 plot(W, power.stretch=0.5)

产生这个情节:

在此处输入图像描述

但是,如果我尝试删除轴,则会axes=F收到以下消息:

plot(W, power.stretch=0.5, axes=F)
Error in plot.default(NA, NA, xlim = xlim, ylim = ylim, type = "n", xaxs = xaxs,  : 
formal argument "axes" matched by multiple actual arguments
4

3 回答 3

2

您确实需要更改源,但只是非常轻微。在第 269-270 行wav_xform.R,在plot.wavCMT函数内部更改行:

image(data$x, data$y, imageScale(data$z, power.stretch=power.stretch), ...,
  xlab=xlab, ylab=ylab, axes=TRUE)

image(data$x, data$y, imageScale(data$z, power.stretch=power.stretch), ...,
  xlab=xlab, ylab=ylab)

原因是省略号 ( ...) - 这意味着“将任何额外的参数plot传递给函数并将它们传递给image函数”。但是,原始代码也axes=TRUE有,这意味着如果你尝试通过axes=FALSE,你会得到一个formal argument "axes" matched by multiple actual arguments错误。

然后(一旦重新安装),以下工作可以摆脱轴:

library(wmtsa)
sunspots.cwt <- wavCWT(sunspots)
plot(sunspots.cwt)  # has axes
plot(sunspots.cwt, axes=FALSE)  # does *not* have axes

另请注意,由于省略号,您可以更改其他常见的绘图参数!(即使您从不修改源代码也是如此)。例如:

plot(sunspots.cwt, main="My great wavelet plot")  # change title
plot(sunspots.cwt, xlim=c(1750, 1850))  # change x axis range
plot(sunspots.cwt, ylim=c(0, 2))  # change y axis range
于 2013-01-25T17:03:49.250 回答
2

wmtsa包定义了一个专门用于类对象的方法。因为它是一个 S3 方法,所以它被调用,但它被声明为不可见,如以下命令所示(加载包后):plotwavCWTplot.wavCWT

methods(plot)

默认情况下,使用 R,您只需键入不带括号的名称即可获取函数的源代码。但它在这里不起作用,因为该功能是不可见的。所以你必须这样做:

getAnywhere(plot.wavCWT)

您可以做的一件事是复制源代码,然后使用以下命令重新定义函数:

plot.wavCWT <- function (x, xlab = NULL, ylab = NULL, logxy = "y", power.stretch = 0.5, 
phase = FALSE, series = FALSE, series.ylab = "", zoom = NULL, 
type = "image", grid.size = 100, add = FALSE, theta = 120, 
phi = 30, ...) {
    ...paste your original code here...
}

然后您可以根据需要修改原始代码并执行您的函数定义以使其可用于您的脚本。

我不完全确定您需要修改哪些内容以满足您的需要,但函数定义中有以下块:

        plot(series.time, x.series[itime], type = "l", col = "blue", 
            axes = TRUE, xlim = range(series.time), ylab = series.ylab, 
            xlab = "", xaxt = "n", xaxs = "i")

然后,您可以更改axes=TRUE为,axes=FALSE或者更好的是,将参数添加plotaxes=TRUE到您的函数定义中,然后更改axes=TRUEaxes=plotaxes.

于 2013-01-25T17:07:32.670 回答
0

不修改功能码的快速解决方案:

x=seq(1:10)
y=x
plot(x,y,ylab="unwanted y label",xlab="x")
mtext("unwanted y label", side=2, line=3, col="white", cex=1)
mtext("my new y label", side=2, line=3, col=1, cex=1)

上面的代码用白色覆盖了之前的 y 标签,然后将标签替换为所需的标签。

于 2015-07-30T16:46:05.300 回答