热图与2d平滑使用从格点额外的levelplot函数



我一直在尝试用这里的代码复制这个情节

我最后的尝试让我非常接近,但我找不到合适的方法使图形看起来像我想要的。在我的数据中,z是在x和y条件下进行的模拟的数值结果,我想绘制这种关系,就像你可以简单地通过散点图那样,但是更漂亮。

我的df相当大,但它有这个方面:

  • x→120 - 300
  • 连续变量
  • y→0.2 - 1.8
  • 连续变量
  • z→
  • 范围从-0.0001到3000的连续变量

这是我用这个代码生成的第一次尝试

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之间的区别所以我的间隔从1开始,其余的是根据不同实验的z值(这个超过3000,其他只有30)的刻度

我也试图分开这两个图形,你可以看看散点图和2dSmooth面板。下面是两者的代码:

## 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结果是足够的,问题是我无法标记它们,因为我不知道函数所采取的极限。如果有一种方法可以正确地标记这个图,那就是它。否则,我需要将两者合并。

你知道我在哪里搞砸了吗?我的二维平滑图有可能和其他库一起完成吗?到目前为止,我还没有发现任何类似的levelplot()与panel.2dsmooth

谢谢你的帮助

您的问题似乎与您的数据非常相关,因此在没有访问数据的情况下很难回答。但一般来说,

  • 我有点惊讶,你得到一组不同的切割点与你的2dSmooth图,因为当你不指定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

最新更新