让image.default使用类定义的Axis函数?

时间:2012-06-01 10:44:34

标签: oop r graphics

比较以下内容:

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.default)似乎无法将类定义的轴函数考虑在内,而绘图则如此。这是有问题的,因为我正在实现一些具有自定义prettyformat规范的类,这些规范将有自己的绘制轴的方式,所以我想拥有自己的轴函数在使用图像时调用,而不是始终使用数字版本。

据我所知,有一种方法可以手动绘制轴,例如先用xaxt = "n"调用图像。但这似乎很不方便而且很混乱。理想情况下,我想要一个解决方案,它可以覆盖现有功能,同时尽可能少地破坏现有功能。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用image()来抑制axes = FALSE调用中的轴,然后自行添加。 E.g:

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 generic:

来完成
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()泛型和类x以及y的S3方法,并适当地调用您的方法,上述方法应该正常工作。您需要记住的是将image()更改为Image()

你也可以编写自己的image()方法,并将你的课程添加到x以调用它而不是image.default()取决于x是否有意义有没有上课?

我这样做的原因是,更改image.default() R-wide的唯一方法是编辑该功能并将其分配给图形命名空间或来源您的版本并调用它明确。每次启动时都需要这样做。一个自定义函数可以很容易地被提供或添加到你自己的本地misc函数包中,你可以在R启动时加载它们以便它自动可用。有关如何安排此操作的详细信息,请参阅?Startup