【问题标题】:Is there a way to create a 3d plot with contours beneath the plot in R?有没有办法在 R 中创建一个带有轮廓的 3d 图?
【发布时间】:2020-03-12 02:41:41
【问题描述】:

有没有办法在R 中创建一个像这样在图下方有轮廓的 3d 图?如果没有,有没有办法将我现有的等高线图放在 3d persp 图的顶部?

我已经能够制作 3d 图和函数和约束的等高线图,但无法将两者结合起来。这是我的R 代码:

obj = function(x1,x2){
  value = -(cos((x1-.1)*x2))^2 - x1*sin(3*x1+x2)
  return(value)
}

con1 = function(x1,x2){
  t = atan2(x1,x2)
  value = x1^2 + x2^2 -((2*cos(t)-1/2*cos(2*t)-1/4*cos(3*t)-1/8*cos(4*t))^2) - ((2*sin(t))^2)
  return(value)
}


x1 = seq(-2.25,2.5,.015)
x2 = seq(-2.5,1.75,.015)

out = outer(x1,x2,obj)

infeasible = ifelse(c(outer(x1,x2,con1)<=0),1,0)
image(x1,x2,out,xlab=expression(x[1]),ylab=expression(x[2]),main="Modified Townsend Problem")

X = cbind(expand.grid(x1,x2),infeasible)
points(X[X[,3]==0,1],X[X[,3]==0,2],pch=19,col="lightgrey")

persp(x1,x2,out,phi=35,col="lightgrey")

非常感谢任何建议或包。

【问题讨论】:

    标签: r plot


    【解决方案1】:

    我认为这可以通过?contourLines 和您的观点进行一些转换:

    p <- persp(x1, x2, out, phi=35, col="#00000000", border=NA, box=FALSE)
    cl <- contourLines(x1, x2, replace(out, outer(x1,x2,con1) > 0, NA))
    levs <- factor(sapply(cl, `[[`, "level"))
    Map(
      function(cl,col) lines(trans3d(cl$x, cl$y, min(out), pmat=p), col=col),
      cl,
      hcl.colors(nlevels(levs), "YlOrRd", rev = TRUE)[levs]
    )
    par(new=TRUE)
    persp(x1, x2, out, phi=35, col="lightgrey")
    

    【讨论】:

    • 太棒了!谢谢你。有没有办法添加与 image() 函数产生的颜色相同的颜色
    • @JohnSmith - 可能每个cl (contourLines) 列表部分都有一个$level 组件,您可以将其映射到颜色。
    • 而且我想我还需要受限版本。
    • @JohnSmith - 查看现在有颜色的更新版本。约束我不知道该怎么做。
    • 要进行约束,只需添加out[which(outer(x1,x2,con1)&gt;0)]=NA
    猜你喜欢
    • 2014-10-17
    • 2020-10-31
    • 2014-11-28
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多