2013-08-24 10 views
9

Mam pytanie dotyczące tabeliGrob/grid.table z pakietu gridExtra. Korzystając ze zwykłych ustawień parametrów, można łatwo zamieniać naprzemiennie rzędy. Miałem jednak nadzieję, że uda się uzyskać nieco większą kontrolę nad kolorystyką rzędów.gridExtra Kolor różne wiersze z tabelą Grob

Na przykład, czy można pokolorować każdy kolejny wiersz w innym kolorze? Podejrzewam, że funkcja grid.edit jest jednym ze sposobów podejścia do tego, sądząc po przykładzie w tym linku: http://code.google.com/p/gridextra/wiki/tableGrob, ale nie mogę wymyślić, jak zastosować to do mojego pytania.

Uważam, że osoba, która wysłała to pytanie, miała na myśli to samo. Table with rows of different colors with tableGrob

Obecnie utknąłem z R 2.13 z powodu problemów ze zgodnością, więc jeśli istnieją jakieś sugestie, które nie dotyczą późniejszych wersji, które byłyby idealne.

Przykład Kod:

library(gridExtra) 

grid.table(mtcars[1:10, ], 
      gpar.coretext = gpar(fontsize = 10), 
      gpar.corefill = gpar(fill = "lightblue", alpha=0.5, col = NA), 
      h.even.alpha = 0.5 
      ) 

example table

+2

Witamy na przepełnienie stosu i dobrze zrobione na przedstawieniu inne pytania w swoim własnym, aby pokazać, że zrobiłeś jakąś pracę na własną rękę. Mogę zasugerować, że w przyszłych pytaniach podaję [przykład odtwarzalny] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), używając własnych danych, "fałszywe" dane lub wbudowane, takie jak zestaw danych 'mtcars'. Prosty, a nawet minimalny, jest najlepszy (dodałem jeden do twojego), wystarczy, aby inni mogli kopiować, wklejać i eksperymentować. – SlowLearner

Odpowiedz

8

wychodząc z v> = 2.0.0 od gridExtra, grid.table polega obecnie na gtable i mogą być dostosowane do głębszych poziomie, niż w poprzednich wersjach. vignette has more examples, ale dla kompletności tutaj jest przykładem ilustrującym sposób, aby wyróżnić konkretne komórki

g <- tableGrob(iris[1:4, 1:3]) 
find_cell <- function(table, row, col, name="core-fg"){ 
    l <- table$layout 
    which(l$t==row & l$l==col & l$name==name) 
} 

ind <- find_cell(g, 3, 2, "core-fg") 
ind2 <- find_cell(g, 2, 3, "core-bg") 
g$grobs[ind][[1]][["gp"]] <- gpar(fontsize=15, fontface="bold") 
g$grobs[ind2][[1]][["gp"]] <- gpar(fill="darkolivegreen1", col = "darkolivegreen4", lwd=5) 
grid.draw(g) 

Edit: powyższa funkcja jest łatwo "wektoryzowane"

find_cells <- function(table, row, col, name="core-fg"){ 
    l <- table$layout 
    unlist(Map(function(r, c) which(((l$t-1) == r) & ((l$l-1) == c) & (l$name == name)), row, col)) 
} 

modify_cells <- function(g, ids, gp=gpar()){ 
    for(id in ids) g$grobs[id][[1]][["gp"]] <- gp 
    return(g) 
} 

ids <- find_cells(g, 1:3, c(3,2, 1), "core-fg") 
g <- modify_cells(g, ids, gpar(fontsize=15, fontface="bold")) 

grid.newpage() 
grid.draw(g) 

enter image description here

Należy pamiętać, że w większości przypadków byłby bardziej NSE aby określić parametry podczas budowy tabeli,

faces <- sample(1:4, size = prod(dim(iris[1:4, 1:2])), replace = TRUE) 
tt <- ttheme_default(core=list(fg_params=list(fontface=faces))) 

grid.table(iris[1:4, 1:2], theme=tt) 

enter image description here

+0

Nie wiem, czy ktoś nadal tu nasłuchuje, ale spróbuję tak czy inaczej: czy możliwe jest zmodyfikowanie funkcji find_cell tak, aby znalazła kilka różnych komórek naraz, a nie tylko jeden po drugim? Na przykład, wszystkie Sepal.Length> 4.8 są napisane czcionką pogrubioną. Mam tabelę Grob z testowaniem istotności statystycznej i potrzebuję, aby wszystkie wartości p <0,05 były pogrubione. Byłoby dobrze mieć to w jednej funkcji, zamiast ręcznie robić to dla każdej komórki. dzięki – PaoloCrosetto

+0

Co oznacza nazwa "" core-fg "oznacza/robi? – user2946746

+0

tabela jest podzielona na 3 części: nagłówek kolumny, nagłówek wiersza i komórki jądra (bryłę) .Każdy z nich ma dwie" warstwy ": prostokąt tła (szary tutaj dla rdzenia, ciemniejszy dla nagłówka kolumny) i pierwszy plan ("fg") dla tekstu. – baptiste

Powiązane problemy