在2D热图上添加第三个维度

时间:2017-08-18 09:37:15

标签: r

我想知道你是否可以帮助我解决以下问题:

对于相关矩阵中的每个可能的对,我都有一个相关矩阵和第三个变量(连续)。

这是一个玩具示例:

set.seed(1234)
x <- rnorm(1000,2,1)
y <- 0.1*x+rnorm(1000,1,1)
z <- y+rnorm(1000)
third.dimension <- c("(x,y)" = 0.3, "(x,z)" = 0.5, "(y,z)"= 1)
my.df <- data.frame(x,y,z)

首先,我想创建一个与

相关的相关矩阵的热图
heatmap(cor(my.df))

接下来,我希望在热图的每个“单元格”中都有一个彩色圆点,具体取决于相应对的第三个维度的值。示例 - 如果值介于0和0.49之间,则我有一个黑点,如果介于0.5和1之间,则为灰点等。

因此,如果我有z和y之间的相关性,比方说,我会在相关矩阵的相应“单元格”中画一个灰点。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这应该适合你:

set.seed(1234)
x <- rnorm(1000,2,1)
y <- 0.1*x+rnorm(1000,1,1)
z <- y+rnorm(1000)
third.dimension <- c("(x,y)" = 0.3, "(x,z)" = 0.5, "(y,z)"= 1)
my.df <- data.frame(x,y,z)


# required function
val2col <- function(z, zlim, col = heat.colors(12), breaks){
 if(!missing(breaks)){
  if(length(breaks) != (length(col)+1)){stop("must have one more break than color")}
 }
 if(missing(breaks) & !missing(zlim)){
  breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) 
 }
 if(missing(breaks) & missing(zlim)){
  zlim <- range(z, na.rm=TRUE)
  breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1))
 }
 CUT <- cut(z, breaks=breaks, include.lowest = TRUE)
 colorlevels <- col[match(CUT, levels(CUT))] # assign colors to heights for each point
 return(colorlevels)
}


# plot
COR <- list(
  x = seq(ncol(my.df)),
  y = seq(ncol(my.df)),
  z = cor(my.df)
)

image(COR, xaxt="n", yaxt="n")
axis(1, at=COR$x, labels = names(my.df))
axis(2, at=COR$x, labels = names(my.df))
box()

COR$col <- val2col(c(COR$z), col = grey.colors(21), zlim=c(0,1))
points(expand.grid(x=COR$x, y=COR$y), col=COR$col, pch=16, cex=3)

enter image description here