【问题标题】:Create 3D Plot Colored According to the Z-axis创建根据 Z 轴着色的 3D 绘图
【发布时间】:2012-05-08 13:51:58
【问题描述】:
 library(Sleuth2)

 mlr<-lm(ex1222$Buchanan2000~ex1222$Perot96*ex1222$Gore2000)


for (i in 0:3) {
           assign(paste("betaHat", i, sep=""), 
           summary(mlr)$coeff[i+1,1])
               }

x<-sort(ex1222$Perot96)
y<-sort(ex1222$Gore2000)


z1 <- outer(x, y, function(a,b) betaHat0+betaHat1*a+betaHat2*b+betaHat3*a*b)
nrz <- nrow(z)
ncz <- ncol(z)

# Create a function interpolating colors in the range of specified colors
jet.colors <- colorRampPalette( c("blue", "red") ) 

# Generate the desired number of colors from this palette
nbcol <- 100
color <- jet.colors(nbcol)

# Compute the z-value at the facet centres
zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz]

# Recode facet z-values into color indices
facetcol <- cut(zfacet, nbcol)

persp(x, y, z1, col=color[facetcol],theta=-30, lwd=.3,xlab="Perot 96", ylab="Gore 2000", zlab="Predicted Votes for Buchanan")

你好,

我正在尝试为上面的图着色。我在想我想要更高的“z”值,颜色更深的红色(或任何颜色)。

任何有关如何实现这一目标的帮助将不胜感激。

此外,您也可以随意提出不同的功能来实现这一点。

谢谢!

编辑....在查看 ?persp 上的示例后,我放置了我的新代码。我想更改颜色,但我对新情节的可读性不太满意

【问题讨论】:

  • ?persp 中的示例 4 标题为“对应于 z 值的表面颜色”,并演示了您所要求的内容。使其适应您自己的数据应该不会太难。
  • 好建议。我会调查的。
  • 查看了该示例。这是我想要的,但他们使用两种颜色。我想要一种颜色。
  • 您可以尝试一些调色板,例如:plot(1:20, pch=16, col=colorRampPalette(c("white", "blue"))(20), cex=3)plot(1:20, pch=16, col=colorRampPalette(blues9)(20), cex=3)。一旦你找到了你喜欢的,你可以将它加入到persp() 电话中。 (colorRampPalette() 一开始有点难以理解,因为它本身返回的是一个函数而不是调色板,但是一旦你掌握了它,它就会非常酷。)

标签: r 3d plot


【解决方案1】:

我稍微修改了你的代码。

library(Sleuth2)

使用data 参数通常比使用通过$ 从数据框中提取的预测变量更好:

mlr<-lm(Buchanan2000~Perot96*Gore2000,data=ex1222)

我们可以使用expand.grid()predict() 以干净的方式获得回归结果:

perot <- seq(1000,40000,by=1000)
gore <-  seq(1000,400000,by=2000)

如果您希望在观察位置评估方面,可以改用perot &lt;- sort(unique(ex1222$Perot96)); gore &lt;- sort(unique(ex1222$Gore2000))

pframe <- with(ex1222,expand.grid(Perot96=perot,Gore2000=gore))
mlrpred <- predict(mlr,newdata=pframe)

现在将预测转换为矩阵:

nrz <- length(perot)
ncz <- length(gore)
z <- matrix(mlrpred,nrow=nrz)

我选择了从浅红色(#ffcccc,红色加上相当多的蓝色/绿色)到深红色(#cc0000,一点红色,没有别的)。

jet.colors <- colorRampPalette( c("#ffcccc", "#cc0000") ) 

您也可以使用grep("red",colors(),value=TRUE) 来查看 reds R 内置了什么。

# Generate the desired number of colors from this palette
nbcol <- 100
color <- jet.colors(nbcol)

# Compute the z-value at the facet centres
zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz]
# Recode facet z-values into color indices
facetcol <- cut(zfacet, nbcol)

persp(perot, gore, z,
      col=color[facetcol],theta=-30, lwd=.3,
      xlab="Perot 96", ylab="Gore 2000", zlab="Predicted Votes for Buchanan")

你说你“对情节的可读性不太满意”,但这不是很具体......我会花一些时间在?persp页面上看看你的一些选择是什么......

另一个选择是rgl 包:

library(rgl)
## see ?persp3d for discussion of colour handling
vertcol <- cut(z, nbcol)
persp3d(perot, gore, z,
      col=color[vertcol],smooth=FALSE,lit=FALSE,
      xlab="Perot 96", ylab="Gore 2000", zlab="Predicted Votes for Buchanan")

也许还值得看看car 包中的scatter3d(关于 SO 的其他帖子描述了如何调整它的一些图形属性)。

library(car)
scatter3d(Buchanan2000~Perot96*Gore2000,data=ex1222)

【讨论】:

  • Ben,您获得模型预测的方法绝对比我使用的方法更巧妙!感谢您的帮助。我认为我更喜欢将原始数据保留在情节中,因为它可以让您更多地了解我的感受。通过“对绘图的可读性不太满意”,我想我觉得用单个 2-D 绘图显示这个在响应面上具有不同曲率的 3-D 模型是不可避免的尴尬。可以单击并拖动以旋转图片的绘图会很棒。再次感谢!
  • 好吧,你并没有真正保留“原始数据”——只是 x 和 y 位置。见编辑。 rgl::persp3dcar:scatter3d 将为您提供动态透视图...
  • 再次感谢!出于某种原因,我在将“rgl”包加载到我的 Mac 上时遇到了一些困难。一般而言,该软件包似乎是一个当前的问题。我同意这不是原始数据,也许你的方式更好。
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2018-04-22
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多