With a bit of hacking, you can do this in a very similar R package, corrgram . This allows you to easily define your own panel functions and helps you easily view them as templates. Here the code and the figure appeared:
set.seed(42) library(corrgram) # This panel adds significance starts, or NS for not significant panel.signif <- function (x, y, corr = NULL, col.regions, digits = 2, cex.cor, ...) { usr <- par("usr") on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) results <- cor.test(x, y, alternative = "two.sided") est <- results$p.value stars <- ifelse(est < 5e-4, "***", ifelse(est < 5e-3, "**", ifelse(est < 5e-2, "*", "NS"))) cex.cor <- 0.4/strwidth(stars) text(0.5, 0.5, stars, cex = cex.cor) } # This panel combines edits the "shade" panel from the package # to overlay the correlation value as requested panel.shadeNtext <- function (x, y, corr = NULL, col.regions, ...) { if (is.null(corr)) corr <- cor(x, y, use = "pair") ncol <- 14 pal <- col.regions(ncol) col.ind <- as.numeric(cut(corr, breaks = seq(from = -1, to = 1, length = ncol + 1), include.lowest = TRUE)) usr <- par("usr") rect(usr[1], usr[3], usr[2], usr[4], col = pal[col.ind], border = NA) box(col = "lightgray") on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) r <- formatC(corr, digits = 2, format = "f") cex.cor <- .8/strwidth("-X.xx") text(0.5, 0.5, r, cex = cex.cor) } # Generate some sample data sample.data <- matrix(rnorm(100), ncol=10) # Call the corrgram function with the new panel functions # NB: call on the data, not the correlation matrix corrgram(sample.data, type="data", lower.panel=panel.shadeNtext, upper.panel=panel.signif)

The code is not very clean, as it basically fixes the functions from the package, but it should give you a good start to get the plot you want. Perhaps you can also use a similar approach with the corrplot package.
update: Here is the version with stars and cor in the same triangle:
panel.shadeNtext <- function (x, y, corr = NULL, col.regions, ...) { corr <- cor(x, y, use = "pair") results <- cor.test(x, y, alternative = "two.sided") est <- results$p.value stars <- ifelse(est < 5e-4, "***", ifelse(est < 5e-3, "**", ifelse(est < 5e-2, "*", ""))) ncol <- 14 pal <- col.regions(ncol) col.ind <- as.numeric(cut(corr, breaks = seq(from = -1, to = 1, length = ncol + 1), include.lowest = TRUE)) usr <- par("usr") rect(usr[1], usr[3], usr[2], usr[4], col = pal[col.ind], border = NA) box(col = "lightgray") on.exit(par(usr)) par(usr = c(0, 1, 0, 1)) r <- formatC(corr, digits = 2, format = "f") cex.cor <- .8/strwidth("-X.xx") fonts <- ifelse(stars != "", 2,1)

Also commented on another way to show significance, it will be bold over the threshold, and not using stars. Perhaps this will be clearer, depending on what you want to show.