比较以下内容:
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)在绘图时未能考虑类定义的轴函数,而绘图则考虑了。这是有问题的,因为我正在实现一些具有自定义pretty
和format
规范的类,这些类将具有自己的绘制轴的方式,因此我希望在使用图像时调用自己的轴函数,而不是始终使用数字版本。
我知道有一种方法可以通过手动绘制轴来解决这个问题,例如,首先用xaxt = "n"
调用图像。但这似乎不方便和混乱。理想情况下,我想要一个解决方案,它可以覆盖现有功能,同时尽可能少地破坏东西。有什么想法吗?
最简单的方法是在调用image()
时抑制轴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()
泛型和类x
的 S3 方法,y
适当地调用您的方法,并且上述方法应该正常工作。您需要记住的是 将image()
更改为 Image()
.
您还可以编写自己的 image()
方法,并将您的类添加到 x
以调用它而不是image.default()
取决于x
是否有类是否有意义?
我会这样做的原因是,更改 R 范围image.default()
的唯一方法是编辑函数并将其分配给图形命名空间或获取您的版本并显式调用它。每次启动 R 时都需要执行此操作。自定义函数可以很容易地获取或添加到你自己的本地杂项函数包中,你可以安排在 R 启动时加载这些函数,以便它自动可用。有关如何安排此操作的详细信息,请参阅?Startup
。