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
,您可以直接对 x
和 y
数据进行日志转换,并使用自定义 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)))
您也可以尝试 ggplot2
与 scale_y_log10()
和 scale_x_log10()
是否适合您,请参阅 this question and answer。
这是使用 lattice
和 latticeExtra
的替代方法
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
)
我想绘制一个 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
,您可以直接对 x
和 y
数据进行日志转换,并使用自定义 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)))
ggplot2
与 scale_y_log10()
和 scale_x_log10()
是否适合您,请参阅 this question and answer。
这是使用 lattice
和 latticeExtra
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
)