0

比较以下内容:

par(mfrow = 2)
image(x=as.POSIXct(1:100, origin = "1970-1-1"), z= matrix(rnorm(100*100), 100))
plot(x=as.POSIXct(1:100, origin = "1970-1-1"), (rnorm(100)))

似乎 image (以及 image.default )在绘图时未能考虑到类定义的 Axis 函数,而 plot 确实如此。这是有问题的,因为我正在使用自定义prettyformat规范实现一些类,这些类将有自己的绘制轴的方式,所以我希望在使用图像时调用我自己的轴函数,而不是总是使用数字版本。

我知道有一种方法可以通过手动绘制轴来解决这个问题xaxt = "n",例如首先调用 image 。但这似乎不方便和混乱。理想情况下,我想要一个解决方案,它可以直接覆盖现有功能,同时尽可能少地破坏。有什么想法吗?

4

1 回答 1

1

最简单的方法在调用image()with时抑制轴,axes = FALSE然后自己添加它们。例如:

set.seed(42)
X <- as.POSIXct(1:100, origin = "1970-1-1")
Z <- matrix(rnorm(100*100), 100)
image(x = X, z = Z, axes = FALSE)
axis(side = 2)
axis.POSIXct(side = 1, x = X)
box()

这也可以使用Axis()S3 泛型来完成:

image(x = X, z = Z, axes = FALSE)
axis(side = 2)
Axis(x = X, side = 1)
box()

因此,要真正尝试回答问题,我会将其包装到一个自动执行各个步骤的函数中:

Image <- function(x = seq(0, 1, length.out = nrow(z)),
                  y = seq(0, 1, length.out = ncol(z)),
                  z, ...) {
    image(x = X, z = Z, ..., axes = FALSE)
    Axis(x = y, side = 2, ...)
    Axis(x = X, side = 1, ...)
    box()
}

将您的轴函数编写为Axis()泛型和类的 S3 方法,xy适当地调用您的方法,并且上述方法应该可以正常工作。您需要记住的只是更改image()Image().

您也可以编写自己的image()方法,并添加您的类以x调用它而不是取决于拥有一个类image.default()是否有意义?x

我这样做的原因是,更改image.default()R 范围的唯一方法是编辑函数并将其分配给图形命名空间或获取您的版本并显式调用它。每次启动 R 时都需要执行此操作。自定义函数可以轻松获取或添加到您自己的本地 misc 函数包中,您可以在 R 启动时安排加载这些函数,以便它自动可用。请参阅?Startup有关如何安排的详细信息。

于 2012-06-01T11:11:39.200 回答