2017-05-18 16 views
0

ヒートマップを作成して、色の最高値を薄い青色に、最低値を濃い青色に、そして異なる色合いを列全体に表示したいと考えています。これは、フルテーブルではなく、カラム単位で行う必要があります。テーブル内の各列のヒートマップを作成する方法

どうすればこのことができますか?

サンプルコード:

library(gtable) 
library(grid) 
library(gridExtra) 

g <- tableGrob(iris[1:4, 1:3]) 
g <- gtable_add_grob(g, 
    grobs = rectGrob(gp = gpar(fill = NA, lwd = 2)), 
    t = 2, b = nrow(g), l = 1, r = ncol(g)) 
g <- gtable_add_grob(g, 
    grobs = rectGrob(gp = gpar(fill = NA, lwd = 2)), 
    t = 1, l = 1, r = ncol(g)) 
grid.draw(g) 
+0

私はあなたのセルの値に基づいて、式と列の最大を使用することができます考えています。 grobs g $ grobs [2] [[1]] [["gp"]]私の問題は、grobsがどのように構造化されているのかよく分かりません.2,1、および "gp"は何を表しますか? – user2946746

+0

Any私はあなたが探していたものを理解するのに時間がかかりましたが、私はそこにいると思います。フィードバックを与えない限り、確かにわかりません – AkselA

+0

http: /stackoverflow.com/a/32711620/471093 – baptiste

答えて

1

あなたが機能を上書きすることができますgrid.tableであまり知られていない機能がありますテーマ

library(gtable) 
library(grid) 
library(gridExtra) 

iris <- as.matrix(iris[1:4, 1:3]) 

# a simple function to scale each column to the range [0, 1] 
norm <- function(x) { 
    apply(x, 2, function(y){(y-min(y))/(max(y)-min(y))}) 
} 

bluecol <- colorRamp(c("#3366EE", "#AABBFF", "#DDDDFF"))(norm(iris)) 
bluecol <- rgb(bluecol[, 1], bluecol[, 2], bluecol[, 3], max=255) 

tt <- ttheme_default(core=list(bg_params=list(fill=bluecol))) 

g <- tableGrob(iris, theme=tt) 
g <- gtable_add_grob(g, 
    grobs = rectGrob(gp = gpar(fill = NA, lwd = 2)), 
    t = 2, b = nrow(g), l = 1, r = ncol(g)) 
g <- gtable_add_grob(g, 
    grobs = rectGrob(gp = gpar(fill = NA, lwd = 2)), 
    t = 1, l = 1, r = ncol(g)) 
grid.draw(g) 

enter image description here

+0

ありがとう、これはうまくいきました:) – user2946746

+0

@ user2946746:よく聞いてください。回答が役に立つと判明した場合は、[accept](https:// meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)it。 – AkselA

0

を定義することによって、それを行うことができます任意のgrobを持つ各セルのtextGrobを作成します。理論的には、各セルの値を処理し、色付きの長方形やスパークラインなどで回転させることは可能です。しかし、やや厄介ですが、非常に遅いです。ここでは、テーブル全体に共通の縮尺のイラストがありますが、問題に適応するのは簡単なはずです(しかし、私はgrid.tableが適切なアプローチではないと思います)。

enter image description here

d <- as.matrix(iris[1:4, 1:3]) 

colourise <- function(d, colours = blues9){ 
    new <- scales::colour_ramp(colours)(scales::rescale(d)) 
    dim(new) <- dim(d) 
    new 
} 

library(grid) 
library(gridExtra) 

my_fun <- function(label, ...){ 

    g <- rectGrob(gp=gpar(fill=label,col="white",lwd=2)) 
    grobTree(g,cl="cell") # wrapper to give a size 
} 

# cells need an absolute size 
widthDetails.cell <- function(x) 
    unit(1,"lines") 
heightDetails.cell <- function(x) 
    unit(1,"lines") 


tt <- ttheme_minimal(12, core=list(fg_fun = my_fun), 
        colhead=list(fg_params=list(fontface="bold"))) 

grid.newpage() 
grid.arrange(tableGrob(colourise(d), cols=colnames(d), theme = tt), tableGrob(d,rows=NULL)) 
関連する問題