进行热图,水平/等高线图和六边形分级的方法

Ite*_*tor 10 plot r ggplot2

R中(x,y,z)的2D图的选项有点多.然而,解决这些选择是一个挑战,特别是在所有三个都是连续的情况下.

为了澄清问题(并可能有助于解释为什么我可能会被绊倒contourimage),这里有一个可能的分类方案:

  • 情况1:未提供z的值,但是基于(x,y)中的值的条件密度.(注意:这基本上是将z的计算降级为单独的函数 - 密度估计.某些东西仍然必须使用该计算的输出,因此允许任意计算会很好.)
  • 情况2:(x,y)对是唯一且规则间隔的.这意味着每个(x,y)值仅提供一个z值.
  • 情况3:(x,y)对是唯一的,但是是连续的.着色或着色仍然只由1个唯一的z值决定.
  • 情况4:(x,y)对不是唯一的,但是有规律地间隔开.着色或着色由z值上的聚合函数确定.
  • 情况5:(x,y)对不是唯一的,是连续的.着色/着色必须由z值上的聚合函数确定.

如果我遗漏了一些情况,请告诉我.我感兴趣的案例是#5.关于关系的一些注释:

  • 案例#1似乎已得到很好的支持.
  • 案例#2不容易受到支持heatmap,image和函数ggplot.
  • 情况#3由基础支持plot,但使用颜色渐变留给用户.
  • 案例#4可以通过使用拆分和应用功能成为案例#2.我以前做过那个.
  • 情况#5可以通过使用转换为#4(然后是#2)cut,但这是不优雅和四四方方的.十六进制分箱可能更好,但这似乎不容易取决于z的值是否存在陡峭的梯度.我决定使用十六进制分箱,但非常欢迎其他聚合函数,特别是如果它们可以使用z值.

我怎么能做#5?这是产生鞍座的代码,虽然spread改变z值的扩展值,这应该在绘制渐变时产生差异.

N       = 1000
spread  = 0.6   # Vals: 0.6, 3.0
set.seed(0)
rot     = matrix(rnorm(4), ncol = 2)
mat0    = matrix(rnorm(2 * N), ncol = 2)
mat1    = mat0 %*% rot
zMean   = mat0[,2]^2 - mat0[,1]^2
z       = rnorm(N, mean = zMean, sd = spread * median(abs(zMean)))
Run Code Online (Sandbox Code Playgroud)

我想做一些类似的事情hexbin,但我已经对此进行了抨击ggplot并且没有取得多大进展.如果我可以将任意聚合函数应用于区域中的z值,那就更好了.(这种功能的形式可能就像plot(mat1, colorGradient = f(z), aggregation = "bin", bins = 50).)

我怎么能在ggplot或其他包中做到这一点?我很高兴将这个问题作为社区维基问题(或者其他用户可以通过编辑足够多次).如果是这样,每一个岗位的回答,请,使我们可以集中精力,说ggplot,levelplot,lattice, contourplot(或image)和其他选项,如果他们存在.


更新1:火山示例是案例#3的一个很好的例子:数据是规则间隔的(可以是纬度/经度),每次观察一个z值.地形图具有(纬度,经度,海拔高度),因此每个位置具有一个值.假设一个人在很多天内为许多随机放置的传感器获得天气(例如降雨,风速,阳光):这更像是#5而不是#3 - 我们可能有lat和long,但是z值可能相当多,即使是相同或附近的(x,y)值.

更新2:到目前为止,DWin,Kohske和John Colby的答案都非常出色.我的实际数据集是一个较大集合的小样本,但在200K点它产生有趣的结果.在(x,y)平面上,它在一些区域具有非常高的密度(因此,在那些区域中会出现过度绘图)并且在其他区域中密度低得多或完全不存在.根据John的建议fields,我需要对数据进行二次采样Tps以便计算出来(我将研究是否可以在不进行二次采样的情况下进行),但结果非常有趣.尝试rms/ Hmisc(DWin的建议),全部200K积分似乎运作良好.Kohske的建议非常好,并且,在绘图之前将数据转换为网格,输入数据点的数量没有问题.它还为我提供了更大的灵活性,可以确定如何聚合区域中的z值.我还不确定我是否会使用均值,中位数或其他一些聚合.

我还打算用其他方法尝试Kohske的mutate+ ddply好例子 - 它是如何在给定区域上计算不同统计数据的一个很好的例子.


更新3:不同的方法是截然不同的,有几种方法是显着的,尽管没有明显的赢家.我选择约翰科尔比作为第一个答案.我想我会在进一步的工作中使用它或DWin的方法.

Joh*_*lby 5

fields对这类问题的包裹感到非常幸运.以下是Tps用于薄板样条的示例:

编辑:组合图并添加标准错误

require(fields)

dev.new(width=6, height=6)
set.panel(2,2)

# Plot x,y
plot(mat1)

# Model z = f(x,y) with splines
fit = Tps(mat1, z)
pred = predict.surface(fit)

# Plot fit
image(pred)
surface(pred)

# Plot standard error of fit 
xg = make.surface.grid(list(pred$x, pred$y))
pred.se = predict.se(fit, xg)

surface(as.surface(xg, pred.se))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述