我最后的尝试让我非常接近,但我找不到合适的方法来使图表看起来像我想要的。
在我的数据中,z 是在 x 和 y 条件下进行模拟的数值结果,我想映射该关系,就像您可以简单地通过散点图所做的那样,但更漂亮。
我的 df 相当大,但它有这个方面:
这是我用此代码生成的第一次尝试
levelplot(z ~ x * y,
data,
panel = panel.levelplot.points,
cex = 0.7,
col.regions = rocket(25, alpha = .8, direction = -1),
colorkey = list(at = (breaks = c(1, 20, 50, 150, 500, Inf))),
scales = list(x=list(at = c(120, 140, 160, 180, 200, 220, 240, 260, 280, 299))),
xlab = "x",
ylab = "y"
) +
layer_(panel.2dsmoother(..., n = 100))
问题是,虽然点可以公平地表示我的数据,但 2d 层却不是。我想特别强调 =1 之间的差异,所以我的中断从 1 开始,其余的将是取决于不同实验的 z 值的比例(这个达到超过 3000,其他最多 30)<1 and >
我还尝试分离这两个图表,您可以查看## Scatter
levelplot(z ~ x * y,
data,
panel = panel.levelplot.points,
cex = 0.7,
at = c(-Inf, 1, 30, 100, 500, Inf),
col.regions = rocket(25, alpha = .8, direction = -1),
colorkey = list(
labels = c("", "1", "30", "100", "500", "")
),
scales = list(x=list(at = c(120, 140, 160, 180, 200, 220, 240, 260, 280, 299))),
xlab = "x",
ylab = "y" )
## 2dSmooth
levelplot(z ~ x * y,
data,
panel = panel.2dsmoother,
n = 200,
cuts = 5,
col.regions = rocket(25, alpha = .8, direction = -1),
colorkey = T,
scales = list(x=list(at = c(120, 140, 160, 180, 200, 220, 240, 260, 280, 299))),
xlab = "x",
ylab = "y"
)
注意我在使用 CUT 和 AT 时遇到问题。当我将 AT 参数传递给 2dSmooth 图时,结果是但是,2dSmooth 图的 CUT 结果是足够的,问题是我无法标记它们,因为我不知道函数所采取的限制。如果有一种方法可以正确标记该图,那就是了。否则,我需要将两者结合起来。
at
时,默认值应该只取决于数据(保持不变)而不是在面板功能上。我不确定发生了什么。
panel.2dsmoother()
基本上只是将回归曲面拟合到您的数据,默认情况下使用
loess()
。如果您的目标是通过将
at
值调整为拟合曲面而不是数据来消除“异常值”的影响,则需要在外部执行此操作。您可以模仿
panel.2dsmoother()
的代码来执行此操作,例如,
n <- 100
mod <- loess(z ~ x * y, data)
xseq <- seq(120, 300, length = n)
yseq <- seq(0.2, 1.8, length = n)
grid <- expand.grid(x = xseq, y = yseq)
fit <- predict(mod, grid)
您现在可以使用标准 levelplot()
调用来可视化该表面,使用
(p <- levelplot(fit ~ x + y, grid))
和相应的at
值应该大致为
do.breaks(range(fit), 5)
您可以使用获得准确的值
trellis.panelArgs(p, 1)$at