TMS - 1 year ago 117
R Question

# corrplot shows insignificant correlation coefficients even when insig = "blank" is set

I like to use correlation plot using

`corrplot`
function with correlation coefficients printed in the cells (using
`addCoef.col`
and
`addCoefasPercent = TRUE`
). I also like to remove the insignificant correlations from the plot (using
`insig = "blank"`
). The problem is that this only works for the background color, but not for the coefficient itself, so the coefficient itself is still printed! See:

``````set.seed(123)
par(cex=0.8) # trick for cor. coef font size, see http://stackoverflow.com/q/26574054/684229
col1 <-rainbow(100, s = 1, v = 1, start = 0, end = 0.9, alpha = 1)
test <- matrix(data=rnorm(400),nrow=20,ncol=20)

cor.mtest <- function(mat, conf.level = 0.95){
mat <- as.matrix(mat)
n <- ncol(mat)
p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)
diag(p.mat) <- 0
diag(lowCI.mat) <- diag(uppCI.mat) <- 1
for(i in 1:(n-1)){
for(j in (i+1):n){
tmp <- cor.test(mat[,i], mat[,j], conf.level = conf.level)
p.mat[i,j] <- p.mat[j,i] <- tmp\$p.value
lowCI.mat[i,j] <- lowCI.mat[j,i] <- tmp\$conf.int[1]
uppCI.mat[i,j] <- uppCI.mat[j,i] <- tmp\$conf.int[2]
}
}
return(list(p.mat, lowCI.mat, uppCI.mat))
}

cor1 <- cor.mtest(test, 0.95)

corrplot(cor(test), p.mat = cor1[[1]], insig = "blank", method = "color", addCoef.col="grey",
order = "AOE", tl.cex = 1/par("cex"),
cl.cex = 1/par("cex"), addCoefasPercent = TRUE)
``````

Now you can see that the coefficients are printed also for the insignificant cells:

Just to see which cells are insignificant, you can use this command:

``````corrplot(cor(test), p.mat = cor1[[1]], insig = "pch", method = "color", addCoef.col="grey",
order = "AOE", tl.cex = 1/par("cex"),
cl.cex = 1/par("cex"), addCoefasPercent = TRUE)
``````

Perhaps this is a bug of corrplot package?

How can I get rid of printing the coefficient in insignificant cells?

You have to do a little work for this. You need to define a vector of colours manually for the p-values, that is passed to `addCoef.col`

If you were ordering alphabetically, it is straight forward

``````mycol <- ifelse(c(cor1[[1]] < 0.05), "black", "white")

corrplot(cor(test), p.mat = cor1[[1]] , insig = "blank", method = "color",
order = "original", tl.cex = 1/par("cex"),
cl.cex = 1/par("cex"), addCoefasPercent = TRUE)
``````

But as you want to order by the eigenvalues you need to calculate the ordering outside of the `corrplot` function

``````ord <-   corrMatOrder(cor(test), order="AOE")
M <- cor(test)[ord, ord]

mycol <- ifelse(c(pval < 0.05), "black", "white")

corrplot(M, p.mat = pval , insig = "blank", method = "color", addCoef.col=mycol ,
order = "original", tl.cex = 1/par("cex"),
cl.cex = 1/par("cex"), addCoefasPercent = TRUE)
``````

There doesn't seem to be an easy way to pass new labels to the colourbar, so that they are in range when coefficients have been added as percent. However, this option just multiplies the coefficients by 100, so we can use this quick approach.

Using the first example above

``````# First plot we multiply the correlation matrix by 100
# set arguments is.corr, and cl.lim, and suppress coefficients
# don't really need the round if setting the range [-100, 100] but perhaps useful for other ranges
corrplot(round(100* cor(test), 1), p.mat = cor1[[1]] , insig = "blank", method = "color",
addCoef.col=NULL ,order = "original", is.corr=FALSE, cl.lim=c(-100, 100))

# Add second plot suppressing the colourbar
corrplot(cor(test), p.mat = cor1[[1]] , insig = "blank", method = "color",