2015-11-10 2 views
4

Недавно я начал использовать tableGrob и gridextra для объединения нескольких графиков и таблиц. Я хочу, чтобы mt tableGrob имел сноску и название.Добавить многострочную сноску в таблицуGrob при использовании gridextra в R

следующие ответы ссылка, что красиво: Adding text to a grid.table plot

Но в коде выше сноска получает укороченные это его слишком долго. Может ли кто-нибудь предложить альтернативу, чтобы сноска автоматически обертывалась на следующую строку, когда она достигла конца таблицы? Если он может обернуться в середине слова, которое также прекрасно.

test <- data.frame(boo = c(20,1), do = c(2,10), no = c(3,5),co = c('ed','jeff')) 

t1 <- tableGrob(test) 

tw <- convertWidth(unit(grobWidth(t1),'npc'), 
        "in", valueOnly = T) 

title <- textGrob("Title is long too or is it??",gp=gpar(fontsize=15)) 
footnote <- textGrob("footnote is pretty longgg but not unusually longgggggggggkjwd jwkldn", x=0, hjust=0, 
        gp=gpar(fontface="italic")) 

padding <- unit(0.5,"line") 

t1 <- gtable_add_rows(t1, 
         heights = grobHeight(title) + padding, 
         pos = 0) 
t1 <- gtable_add_rows(t1, 
         heights = grobHeight(footnote)+ padding) 
t1 <- gtable_add_grob(t1, list(title, footnote), 
         t=c(1, nrow(t1)), l=c(1,1), 
         r=ncol(t1)) 

grid.arrange(t1) 

Long footnote tableGrob

Я хочу, чтобы работать, когда у меня есть сюжет и таблицу в сетке, а также организовать. Пожалуйста помоги.

Я попытался использовать strwrap и установил ширину в grobWidth, но это не сработало для меня.

ответ

4

RGraphics книга/пакет предлагает возможное решение,

splitString <- function (text, width) { 
    strings <- strsplit(text, " ")[[1]] 
    newstring <- strings[1] 
    linewidth <- stringWidth(newstring) 
    gapwidth <- stringWidth(" ") 
    availwidth <- convertWidth(width, "in", valueOnly = TRUE) 
    for (i in 2:length(strings)) { 
    width <- stringWidth(strings[i]) 
    if (convertWidth(linewidth + gapwidth + width, "in", 
        valueOnly = TRUE) < availwidth) { 
     sep <- " " 
     linewidth <- linewidth + gapwidth + width 
    } 
    else { 
     sep <- "\n" 
     linewidth <- width 
    } 
    newstring <- paste(newstring, strings[i], sep = sep) 
    } 
    newstring 
} 


tit <- "Title is long too or is it??" 
foot <- "footnote is pretty longgg but not unusually longgggggggggkjwd jwkldn" 
footnote <- textGrob(splitString(foot, sum(t1$widths))) 
title <- textGrob(splitString(tit, sum(t1$widths))) 
t1 <- gtable_add_rows(t1, heights = grobHeight(footnote)) 
t1 <- gtable_add_rows(t1, heights = grobHeight(title), 0) 
t1 <- gtable_add_grob(t1, list(title, footnote), 
         t=c(1, nrow(t1)), l=1, r=ncol(t1)) 

grid.draw(t1) 
+0

Это прекрасно работает Baptiste.Couple вещей, которые не работают хорошо: 1) Есть ли способ, сноска может сломаться от середины слово? 2) Может ли ширина автоматически определять размер шрифта сноски, а также использовать ширину таблицы? Например, когда я использую шрифт 7 или 10, это будет иметь значение, и если он слишком длинный, это будет просто обрезано в конце таблицы? Было бы здорово, если бы обертка могла быть скорректирована в соответствии со шрифтом сноски. Это может потребовать слишком много! :) Но вышеупомянутое решение отлично поработало! – StatMan

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