R:二维密度图中的不同颜色取决于x和y的值

时间:2013-11-22 11:44:07

标签: r colors plot density-plot

我正在使用 kde2d persp 绘制两个变量x和y的联合密度。

如何执行以下操作:

1)根据x和y的值,我想以不同的方式为绘图着色。即对于值x> .5和y> .5,颜色应为蓝色,对于x <=。5且y <=。5,颜色应为红色。目前整个图表只是蓝色(见下面的代码)。

2)如何为表面下方的区域(即概率质量)着色?我也想用蓝色和红色分别着色。

library(MASS)
    i<-1
    x<-NULL 
    y<-NULL 
    while (i<=30) {
      x1 <- rnorm(1, 0, 1)
      x2 <- rnorm(1, 0, 1)
      x <- c(x, x1)
      y<-c(y,x2)
      i<-i+1 
    }
    den3d <- kde2d(x, y)
    persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", shade = 0.1, col = "blue", box=TRUE)

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

这回答了第一个问题:

x <- rnorm(30)
y <- rnorm(30)

library(MASS)
den3d <- kde2d(x, y)

cols <- c("blue", "red")[(outer(na.omit(filter(den3d$x>0.5,c(1,1), sides=1)),
                                na.omit(filter(den3d$y>0.5,c(1,1), sides=1)),
                                "+")==4) + 1]

persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", 
        shade = 0.1, col = cols, box=TRUE, phi=90)

enter image description here

注意,如果小平面的x和y值> 1,则小平面仅显示为红色。在整个方面范围内为0.5。

我认为你不应该按照你在第二个问题中描述的那样做。无论如何,persp不是为此设计的。

编辑:那里发生了什么?

den3d$x是绘图的x值。如果两端的x值> 1,我们需要检查每个方面。 0.5。我们可以通过计算这些值的总和来做到这一点。这可以使用filter完成(有关文档,请参阅help("filter")):

filter(den3d$x>0.5,c(1,1), sides=1)
#[1] NA  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  2  2  2  2  2  2

逻辑输入值由filter自动强制转换为0和1。得到的值0表示&gt;在任何一端没有0.5,1表示>一端为0.5,另一端为2表示>两端都是0.5。我们需要删除NA

然后我们也为den3d$y执行此操作并计算外部总和,这可能导致0到4之间的值.0和4表示构面的所有四个边界都不是并且是>分别为0.5。值1至3表示1至3个边界> 0.5。我们使用TRUE将所有值4(我们想要将颜色“红色”)设置为FALSE,将其他值设置为==。由于我们需要FALSE的值为1而TRUE的值为2才能对颜色向量进行子集化,因此我们(自动)将逻辑值强制为0和1并添加1.

就是这样。