有没有一种方便的方法在knitr中制作热图样式表?

时间:2016-04-30 06:04:52

标签: r knitr

我希望能够在knitr中生成一个表,其中单元格背景颜色将根据映射到单元格中的值的颜色渐变来设置。

有关示例,请参阅towards the bottom of this page

Pander似乎能够进行某些条件突出显示as described in this question,但我找不到允许条件格式化单元格背景的选项。

2 个答案:

答案 0 :(得分:3)

例如,请参阅that page

底部的年龄列

答案 1 :(得分:1)

我过去只是通过解析要传递给xtable的数据帧,并在评估表条目并添加相应的LaTeX颜色标记,在LaTeX中完成了这个。例如,我的LaTeX前言包括:

\usepackage{xcolor,colortbl}
\definecolor{darkblue}{rgb}{0.0,0.0,0.3}
\definecolor{blue0}{HTML}{E5E5FE}
\definecolor{blue1}{HTML}{CBCBFE}
\definecolor{blue2}{HTML}{B2B2FE}
\definecolor{blue3}{HTML}{9898FE}
\definecolor{blue4}{HTML}{7F7FFE}
\definecolor{blue5}{HTML}{6666FE}
\definecolor{blue6}{HTML}{4C4CFE}
\definecolor{blue7}{HTML}{3333FE}
\definecolor{blue8}{HTML}{1919FE}
\definecolor{blue9}{HTML}{0000FE}

在我的代码中我使用了这个嵌套的for循环(其中KnownResults是一个带有数字条目的数据框):

for(i in seq_along(colnames(KnownResults))){ 
  for(q in seq_along(rownames(KnownResults))){ 
    if(KnownResults[q,i]!="NA"){ 
          if(KnownResults[q,i] > 0.9){ 
            KnownResults[q,i] <- paste0("\\cellcolor{blue9}{", 
                                        "\\textcolor{white}{",
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}}")            
          } else if(KnownResults[q,i] > 0.8){
            KnownResults[q,i] <- paste0("\\cellcolor{blue8}{", 
                                        "\\textcolor{white}{",
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}}")
          } else if(KnownResults[q,i] > 0.7){
             KnownResults[q,i] <- paste0("\\cellcolor{blue7}{", 
                                        "\\textcolor{white}{",
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}}")
          } else if(KnownResults[q,i] > 0.6){
            KnownResults[q,i] <- paste0("\\cellcolor{blue6}{", 
                                        "\\textcolor{white}{",
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}}")
          } else if(KnownResults[q,i] > 0.5){
            KnownResults[q,i] <- paste0("\\cellcolor{blue5}{", 
                                        "\\textcolor{white}{",
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}}")
          } else if(KnownResults[q,i] > 0.4){            
            KnownResults[q,i] <- paste0("\\cellcolor{blue4}{",  
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}")
          } else if(KnownResults[q,i] > 0.3){
            KnownResults[q,i] <- paste0("\\cellcolor{blue3}{", 
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}")
          } else if(KnownResults[q,i] > 0.2){
            KnownResults[q,i] <- paste0("\\cellcolor{blue2}{", 
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}")
          } else if(KnownResults[q,i] > 0.1){
            KnownResults[q,i] <- paste0("\\cellcolor{blue1}{", 
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}")
          } else if(KnownResults[q,i] > 0.0){
            KnownResults[q,i] <- paste0("\\cellcolor{blue0}{", 
                                        formatC(KnownResults[q,i], format='f', digits=4 ),
                                        "}")
          } else {}

    } else { KnownResults[q,i]<-"NS"}
  }

}

我相信你可以修改它以满足你的需要(并可能简化代码!)。

此外,使用以下代码预先确定了渐变颜色值:

HPSColors<-colorRamp(c('white','blue'))
HPSColors<-rgb(HPSColors(seq(from=0.1,to=1.0,by=0.1)),maxColorValue=256)