2013-05-09 4 views
4

Я пытаюсь сделать функцию, которая даст мне график, готовый для indesign, иллюстратора или inkscape. При попытке сделать это у меня есть две проблемы, которые я не могу решить.tableGrob: установить высоту и ширину сетки.table

1) установить ширину и высоту моего участка (или просто grobTable): Выход, который я получаю, очень мал, и при масштабировании его в иллюстраторе шрифт следует и становится большим. Поэтому я хочу делать графики с заданными вручную ширинами и высотами.

2) Иногда заголовок, примечание и имена розеток становятся «неуместными» (подробнее см. Разницу между графиками 1 и 2). Это происходит, когда короткие имена.

library(gridExtra) 
library(ggplot2) 

data(diamonds) 

## plot function 

kryds.row <- function(x,y, p=100, decor="%", digits=3, 
        titel="", note="", red=219, green=55, blue= 153){ 

c <- table(x, y) 
s <- as.character(sum(c)) 
s <- paste("Antal svarpersoner=", s, sep=" ") 
j <- prop.table(c,1) 
r <- c(rownames(j),"Total") 
k <- c(colnames(j), "Total") 
j <- addmargins(j, margin =2, FUN = sum) 
j <- round(j, digits) 
j[]<-paste(j*p, decor, sep=" ") 

farve <- rgb(red,green,blue, maxColorValue =255) 

table  <- tableGrob(j, 
         cols = k, 
         gpar.coretext = gpar(fontsize = 12),    
         gpar.coltext = gpar(fontsize = 12,col="white"),    
         gpar.rowtext = gpar(fontsize = 12, fontface="bold"),    
         gpar.corefill = gpar(fill = rgb(255,255,255, maxColorValue  =255), alpha = 1, col = NA), 
         gpar.rowfill = gpar(fill = rgb(255,255,255, maxColorValue =255), alpha = 1, col = NA),   
         gpar.colfill = gpar(fill = 0, alpha = 1 ,col= "white"),      
         equal.width = TRUE,    
         show.rownames = TRUE,    
         show.rsep  = TRUE, 
         show.hlines = TRUE,        
         show.csep  = FALSE, 
         show.vlines = FALSE, 
         show.box  = FALSE, 
         padding.h  = unit(15, "mm"),    
         padding.v  = unit(8, "mm"), 
         core.just  = "center", 
         row.just  = "left", 
         separator  = farve) 


hh <- grobHeight(table) 
ww <- grobWidth(table) 

border <- roundrectGrob(x=0.5, y=0.5, width=ww, height=hh, 
         default.units="npc", 
         r=unit(0.1, "snpc"), 
         just="centre", 
         name=NULL, gp=gpar(col="white", fill=farve, vp=NULL)) 

border2 <- roundrectGrob(x=0.5, y=0.5, width=ww, height=hh, 
         default.units="npc", 
         r=unit(0.1, "snpc"), 
         just="centre", 
         name=NULL, gp=gpar(fill=NA, col=farve, vp=NULL)) 

title <- textGrob(titel, 
       x=unit(0.5,"npc") -0.5*ww + unit(5, "mm"), 
       y=unit(0.5,"npc") +0.5*hh + unit(2, "mm"), 
       vjust=0,hjust=0, gp=gpar(fontsize=12, fontface="bold")) 

footnote <- textGrob(note, 
        x=unit(0.5,"npc") - 0.5*ww + unit(5,"mm"), 
        y=unit(0.5,"npc") - 0.5*hh, 
        vjust=1, hjust=0,gp=gpar(fontsize=10)) 

svarpersoner  <- textGrob(s, 
          x=unit(0.5,"npc") + 0.5*ww -unit(5, "mm"), 
          y=unit(0.5,"npc") + 0.5*hh + unit(2, "mm"), 
          vjust=0, hjust=1,gp=gpar(fontsize=10)) 
grid.newpage() 
gt <- gTree(children=gList(border,table,border2, title, footnote, svarpersoner)) 
grid.draw(gt) 

} 



# Plot it 
kryds.row(diamonds$color, diamonds$cut, titel="title", note="note") # plot 1 
kryds.row(diamonds$cut, diamonds$color, titel="title", note="note") # plot 2 


# Problems 
#1: The title, note and the j in the row.text is very badly placed in plot 1 but not plot 2 
#2 I cannot set the width and height of my table 

Я еще не очистил свой код, поэтому, пожалуйста, голось с ним!

+1

1. Обоснование по умолчанию для меток строк осталось , вы можете изменить это на центр. 2. Нет возможности установить размер таблицы, к сожалению, он рассчитан для соответствия содержимому и поэтому будет меняться в зависимости от размера шрифта. – baptiste

ответ

1

Решение, которое я пошел с в том, чтобы манипулировать длиной уровней, как это:

longest <- 0 
longestnumber <- 0 

for (i in 1:length(levels(x))){ 

    if (longest < nchar(levels(x))[i]){ 
    longest <- nchar(levels(x))[i] 
    longestnumber <- i 
    } 
    } 

for (i in 1:(100-longest)){ 
    levels(x)[longestnumber] <- paste(levels(x)[longestnumber], " ", sep="") 
    } 

Таким образом, можно контролировать ширину таблицы

+0

@Baptiste - это ширина в Tablegrob в зависимости от того, сколько строк у него есть? – Einnor

4

Текущая версия gridExtra :: tableGrob не позволяет устанавливать ширину/высоту. Тем не менее, вы можете попробовать другую версию tableGrob (experimental), созданную с нуля, с помощью gtable.

#library(devtools) 
#install_github("tablegrob", "baptiste") 
require(tablegrob) 

d <- iris[sample(seq.int(nrow(iris)), 6),] 

grid.newpage() 
pushViewport(viewport(height=0.8,width=0.9)) 
g2 <- tableGrob(d, rows=NULL, 
       widths=unit(1,"null"), heights=unit(1/(nrow(d)),"npc")) 
grid.draw(g2) 
grid.roundrect(y=unit(0,"line"), height=unit(1,"npc") +unit(1,"lines"), 
       just="bottom", r=unit(0.05, "snpc")) 

Edit (08/2015): теперь вы можете редактировать ширина/высоты, так как grid.table теперь основан на gtable.

Смежные вопросы