Coloración condicional de las celdas en la tabla

Intento crear una tabla de datos cuyas celdas sean de colores diferentes según el valor de la celda. Puedo lograr esto con la función addtable2plot del paquete plotrix . La función addtable2plot establece una tabla en un gráfico ya existente. El problema con esa solución es que no quiero un argumento, solo la mesa.

También miré las funciones del heatmap . El problema es que algunos de los valores en mi tabla son caracteres, y las funciones del heatmap , por lo que puedo decir, solo aceptan matrices numéricas. Además, quiero que mis nombres de columna estén en la parte superior de la tabla, no en la parte inferior, y eso no parece ser una opción.

Aquí está el código de ejemplo para addtable2plot . Si pudiera obtener solo la mesa, llenar toda la pantalla, sería genial.

 library(plotrix) testdf<-data.frame(Before=c(10,7,5,9),During=c(8,6,2,5),After=c(5,3,4,3)) rownames(testdf)<-c("Red","Green","Blue","Lightblue") barp(testdf,main="Test addtable2plot",ylab="Value", names.arg=colnames(testdf),col=2:5) # show most of the options including the christmas tree colors abg<-matrix(c(2,3,5,6,7,8),nrow=4,ncol=3) addtable2plot(2,8,testdf,bty="o",display.rownames=TRUE,hlines=TRUE, vlines=TRUE,title="The table",bg=abg) 

Cualquier ayuda sería muy apreciada.

Una alternativa de heatmap de heatmap :

 library(gplots) # need data as matrix mm < - as.matrix(testdf, ncol = 3) heatmap.2(x = mm, Rowv = FALSE, Colv = FALSE, dendrogram = "none", cellnote = mm, notecol = "black", notecex = 2, trace = "none", key = FALSE, margins = c(7, 11)) 

En heatmap.2 el lado de la gráfica en el que se dibujará el axis está codificado. Pero si escribe " heatmap.2 " en la consola y copia el resultado a un editor, puede buscar el axis(1 , donde el 1 es el argumento side (dos visitas). Luego puede cambiar de un 1 (eje a continuación) trazado) a un 3 (eje sobre el trazado). Asigne la función actualizada a un nuevo nombre, p. ej. heatmap.3, y ejecútelo como se indica más arriba.

enter image description here


Una alternativa addtable2plot

 library(plotrix) # while plotrix is loaded anyway: # set colors with color.scale # need data as matrix* mm < - as.matrix(testdf, ncol = 3) cols <- color.scale(mm, extremes = c("red", "yellow")) par(mar = c(0.5, 1, 2, 0.5)) # create empty plot plot(1:10, axes = FALSE, xlab = "", ylab = "", type = "n") # add table addtable2plot(x = 1, y = 1, table = testdf, bty = "o", display.rownames = TRUE, hlines = TRUE, vlines = TRUE, bg = cols, xjust = 2, yjust = 1, cex = 3) # *According to `?color.scale`, `x` can be a data frame. # However, when I tried with `testdf`, I got "Error in `[.data.frame`(x, segindex) : undefined columns selected". 

enter image description here


Una alternativa de color2D.matplot

 library(plotrix) par(mar = c(0.5, 8, 3.5, 0.5)) color2D.matplot(testdf, show.values = TRUE, axes = FALSE, xlab = "", ylab = "", vcex = 2, vcol = "black", extremes = c("red", "yellow")) axis(3, at = seq_len(ncol(testdf)) - 0.5, labels = names(testdf), tick = FALSE, cex.axis = 2) axis(2, at = seq_len(nrow(testdf)) -0.5, labels = rev(rownames(testdf)), tick = FALSE, las = 1, cex.axis = 2) 

enter image description here

Después de este pequeño ejercicio, tiendo a estar de acuerdo con @Drew Steen en que las alternativas de LaTeX también pueden ser investigadas. Por ejemplo, mira aquí y aquí .

Puedes hackear algo con grid y gtable,

 palette(c(RColorBrewer::brewer.pal(8, "Pastel1"), RColorBrewer::brewer.pal(8, "Pastel2"))) library(gtable) gtable_add_grobs < - gtable_add_grob # alias d <- head(iris, 3) nc <- ncol(d) nr <- nrow(d) extended_matrix <- cbind(c("", rownames(d)), rbind(colnames(d), as.matrix(d))) ## text for each cell all_grobs <- matrix(lapply(extended_matrix, textGrob), ncol=ncol(d) + 1) ## define the fill background of cells fill <- lapply(seq_len(nc*nr), function(ii) rectGrob(gp=gpar(fill=ii))) ## some calculations of cell sizes row_heights <- function(m){ do.call(unit.c, apply(m, 1, function(l) max(do.call(unit.c, lapply(l, grobHeight))))) } col_widths <- function(m){ do.call(unit.c, apply(m, 2, function(l) max(do.call(unit.c, lapply(l, grobWidth))))) } ## place labels in a gtable g <- gtable_matrix("table", grobs=all_grobs, widths=col_widths(all_grobs) + unit(4,"mm"), heights=row_heights(all_grobs) + unit(4,"mm")) ## add the background g <- gtable_add_grobs(g, fill, t=rep(seq(2, nr+1), each=nc), l=rep(seq(2, nc+1), nr), z=0,name="fill") ## draw grid.newpage() grid.draw(g) 

enter image description here

Una especie de solución hacky basada en ggplot2 . No entiendo totalmente cómo realmente quieres mapear tus colores, ya que en tu ejemplo los colores de la tabla no están mapeados a los rownames de testdf , pero aquí he mapeado los colores con el value (convertido a un factor) .

 testdf$color < - rownames(testdf) dfm <- melt(testdf, id.vars="color") p <- ggplot(dfm, aes(x=variable, y=color, label=value, fill=as.factor(value))) + geom_text(colour="black") + geom_tile(alpha=0.2) p 

Puede cambiar la variable a la que se asignan los valores usando fill= , y puede cambiar la asignación usando scale_fill_manual(values=[a vector of values] .

Dicho esto, me gustaría ver una solución que produzca una tabla real, en lugar de una ttwig que se haga pasar por una tabla. Posiblemente usando tablas Sweave y LaTeX?

enter image description here