使用latticeExtra中的levelplot函数进行二维平滑的热图

问题描述 投票:0回答:1

我一直在尝试使用这里中的代码重现这个情节

我最后的尝试让我非常接近,但我找不到合适的方法来使图表看起来像我想要的。

在我的数据中,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 开始,其余的将是取决于不同实验的 z 值的比例(这个达到超过 3000,其他最多 30)<1 and >

我还尝试分离这两个图表,您可以查看

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

    知道我哪里搞砸了吗?
  • 是否有可能使用其他库完成我的 2dsmooth 图?到目前为止,我还没有发现任何类似于 levelplot() 和 panel.2dsmoother
谢谢您的帮助

heatmap contour lattice levelplot
1个回答
0
投票
您的问题似乎与您的数据非常具体,因此在无法访问数据的情况下很难回答。但一般来说,

  • 我有点惊讶你的 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
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.