标准化颜色比例尺,面板中的persp()绘图,R

3
我正在创建一个面板,其中包含多个persp图,每个图都显示通过调整复杂回归模型中的预测变量生成的数据范围。我希望我的3D表面按照我的z变量进行颜色编码,这很容易实现。如何将此颜色比例尺扩展到涵盖面板中所有图中表示的所有z变量值的范围,以便可以比较多个persp图之间的颜色比例尺?
#colorized z scale, only a smidge modified from http://www.inside-r.org/r-doc/graphics/persp
par(bg = "white")
par(mfrow=c(1,2))
x <- seq(-1.95, 1.95, length = 30)
y <- seq(-1.95, 1.95, length = 35)
z1 <- outer(x, y, function(a, b) a*b^2)
nrz <- nrow(z1)
ncz <- ncol(z1)
# Create a function interpolating colors in the range of specified colors
jet.colors <- colorRampPalette( c("blue", "green") )
# Generate the desired number of colors from this palette
nbcol <- 100
color <- jet.colors(nbcol)
# Compute the z-value at the facet centres
zfacet <- z1[-1, -1] + z1[-1, -ncz] + z1[-nrz, -1] + z1[-nrz, -ncz]
# Recode facet z-values into color indices
facetcol <- cut(zfacet, nbcol)
persp(x, y, z1, zlim=c(-8, 10.5), col = color[facetcol], phi = 30, theta = -30)
#zlim added to encompass combined ranges of z1 and z2

#exact same code, with different values of z
x <- seq(-1.95, 1.95, length = 30)
y <- seq(-1.95, 1.95, length = 35)
z2 <- outer(x, y, function(a, b) a*b^2+3)
nrz <- nrow(z2)
ncz <- ncol(z2)
# Create a function interpolating colors in the range of specified colors
jet.colors <- colorRampPalette( c("blue", "green") )
# Generate the desired number of colors from this palette
nbcol <- 100
color <- jet.colors(nbcol)
# Compute the z-value at the facet centres
zfacet <- z2[-1, -1] + z2[-1, -ncz] + z2[-nrz, -1] + z2[-nrz, -ncz]
# Recode facet z-values into color indices
facetcol <- cut(zfacet, nbcol)
persp(x, y, z2, zlim=c(-8, 10.5), col = color[facetcol], phi = 30, theta = -30)
#zlim added to encompass combined ranges of z1 and z2

#comparing the values, we see that there's different, overlapping scales from z1 and z2
summary(as.vector(z1))
summary(as.vector(z2))

因此,当您查看z2的两个图时,您会发现它们在某种程度上处于不同的比例尺上。如果我可以让颜色比例尺覆盖z1和z2的范围,那将更加清晰。enter image description here

1个回答

5

在剪切之前,您可以将两个z值向量(矩阵)连接起来,然后在指定颜色时引用结果(剪切)向量的相关子集。

color <- jet.colors(nbcol)
z1facet <- z1[-1, -1] + z1[-1, -ncz] + z1[-nrz, -1] + z1[-nrz, -ncz]
z2facet <- z2[-1, -1] + z2[-1, -ncz] + z2[-nrz, -1] + z2[-nrz, -ncz]
facetcol <- cut(c(z1facet, z2facet), nbcol)
persp(x, y, z1, zlim=c(-8, 10.5), 
      col=color[facetcol[seq_along(z1facet)]], 
      phi=30, theta=-30)
persp(x, y, z2, zlim=c(-8, 10.5), 
      col=color[facetcol[-seq_along(z1facet)]], 
      phi=30, theta=-30)

输入图像描述

或者,使用lattice::wireframe,特别是当处理许多曲面绘图时可能更简单:

library(lattice)
# First, create a named list of the surface matrices.
L <- list(z1=z1, z2=z2)

# Iterate over the elements of L, creating data.frames with row number,
#  column number, and cell value, as well as matrix name (i.e. name of 
#  the element of L).
dat <- do.call(rbind, lapply(seq_along(L), function(i) {
  setNames(data.frame(which(!is.na(L[[i]]), arr.ind=TRUE),
             c(L[[i]]), names(L)[i]),
           c('x', 'y', 'z', 'g'))
}))

# Plot with wireframe, faceting by `g` (the matrix name).
wireframe(z ~ x + y|g, data=dat, drape=TRUE, col.regions=color)

在此输入图片描述

根据需要调整屏幕距离,以获得所需的外观效果,例如:

wireframe(z ~ x + y|g, data=dat, drape=TRUE, col.regions=color, 
          screen=list(z=30, x=-60), distance=0.5)

enter image description here


太棒了!谢谢你! - user3545999

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接