R:如何绘制带有对数刻度刻度的水平图

R: How to draw a level plot with log tick scales

我想绘制一个 x 和 y 尺度为 log10 刻度的水平图。

比如我有一个这样的普通关卡剧情

x <- 10*1:nrow(volcano)
y <- 10*1:ncol(volcano)
filled.contour(x, y, volcano, color = terrain.colors, plot.title = title(main = "Volcano topolgy", xlab = "Meters North", ylab = "Meters West"), plot.axes = { axis(1, seq(100, 800, by = 100)); axis(2, seq(100, 600, by = 100)) }, key.title = title(main = "Height\n(meters)"), key.axes = axis(4, seq(90, 190, by = 10)))

但是,x 和 y 尺度不是对数刻度尺度。我发现另一个库 "latticeExtra" 具有对数刻度函数。例如,使用上面相同的 x 和 y,我可以绘制对数刻度,但不能填充轮廓数据。

library(lattice)
library(latticeExtra)
xyplot(y ~ x, scales = list(x = list(log = 10), y = list(log = 10)), xscale.components = xscale.components.log10ticks, yscale.components = yscale.components.log10ticks)

如何绘制带有对数刻度刻度的水平图?我想稍后在水平图上绘制散点作为日志位置。

提前致谢。

如果您想继续使用 filled.contour,您可以直接对 xy 数据进行日志转换,并使用自定义 axis 语句相应地调整轴,但它不是很优雅(遗憾的是 base::plot log = "xy" 参数在 filled.contour 中没有做任何事情):

x <- log(10*1:nrow(volcano))
y <- log(10*1:ncol(volcano))
filled.contour(x, y, volcano, color = terrain.colors, 
               plot.title = title(main = "Volcano topolgy", 
                                  xlab = "Meters North", 
                                  ylab = "Meters West"), 
               plot.axes = { axis(1, at = log(seq(100, 800, by = 100)), labels = seq(100, 800, by = 100)); 
                                                axis(2, at = log(seq(100, 600, by = 100)), labels = seq(100, 600, by = 100)) }, 
               key.title = title(main = "Height\n(meters)"), 
               key.axes = axis(4, seq(90, 190, by = 10)))

您也可以尝试 ggplot2scale_y_log10()scale_x_log10() 是否适合您,请参阅 this question and answer

这是使用 latticelatticeExtra

的替代方法
library(lattice)
library(latticeExtra)

xx <- 1:nrow(volcano)
yy <- 1:ncol(volcano)

levelplot(
  x = volcano,
  xlim = range(xx),
  ylim = range(yy),
  scales = list(x = list(log = 10), y = list(log = 10)),
  xscale.components = xscale.components.log10ticks,
  yscale.components = yscale.components.log10ticks
)