आर

2014-05-23 7 views
6

में टेबलग्राब का उपयोग कर सेल के लिए टेक्स्ट रंग बदलें, क्या टेबलग्राब और ggplot2 का उपयोग करते समय सेल के पाठ का रंग बदलने के लिए कोई तरीका है? उदाहरण के लिए नीचे दिए गए कोड में यह बहुत अच्छा होगा यदि 1 वाला सेल नीला हो और 2 वाला सेल लाल हो, 3: 8 सभी काले रंग के साथ।आर

library(ggplot2) 
library(grid) 
mytable = as.table(matrix(c("1","2","3","4","5","6","7","8"),ncol=2,byrow=TRUE)) 
mytable = tableGrob(mytable,gpar.coretext = gpar(col = "black", cex = 1)) 
mydf = data.frame(x = 1:10,y = 1:10) 
ggplot(mydf, aes(x, y)) + annotation_custom(mytable) 

धन्यवाद!

उत्तर

9

मेरी निराशा के लिए, यह आसान प्रतीत नहीं होता है। tableGrob फ़ंक्शन makeTableGrobs को ग्रिड ऑब्जेक्ट लेआउट करने के लिए कॉल करता है और पूरी तरह से गणना gTree संरचना देता है। यह अच्छा होगा अगर आप इसे रोक सकते हैं, कुछ गुणों को बदल सकते हैं, और जारी रख सकते हैं; दुर्भाग्य से ड्राइंग gridExtra:::drawDetails.table के साथ किया जाता है और यह फ़ंक्शन फिर से makeTableGrobs पर कॉल करने पर जोर देता है, अनिवार्य रूप से अनुकूलन के लिए किसी भी अवसर को मार रहा है।

लेकिन यह असंभव नहीं है। असल में हम drawDetails.table का अपना संस्करण बना सकते हैं जो पुन: प्रसंस्करण नहीं करता है। शुरुआत में if कथन के साथ gridExtra से फ़ंक्शन यहां दिया गया है।

drawDetails.table <- function (x, recording = TRUE) 
{ 
    lg <- if(!is.null(x$lg)) { 
     x$lg 
    } else { 
     with(x, gridExtra:::makeTableGrobs(as.character(as.matrix(d)), 
     rows, cols, NROW(d), NCOL(d), parse, row.just = row.just, 
     col.just = col.just, core.just = core.just, equal.width = equal.width, 
     equal.height = equal.height, gpar.coretext = gpar.coretext, 
     gpar.coltext = gpar.coltext, gpar.rowtext = gpar.rowtext, 
     h.odd.alpha = h.odd.alpha, h.even.alpha = h.even.alpha, 
     v.odd.alpha = v.odd.alpha, v.even.alpha = v.even.alpha, 
     gpar.corefill = gpar.corefill, gpar.rowfill = gpar.rowfill, 
     gpar.colfill = gpar.colfill)) 
    } 
    widthsv <- convertUnit(lg$widths + x$padding.h, "mm", valueOnly = TRUE) 
    heightsv <- convertUnit(lg$heights + x$padding.v, "mm", valueOnly = TRUE) 
    widthsv[1] <- widthsv[1] * as.numeric(x$show.rownames) 
    widths <- unit(widthsv, "mm") 
    heightsv[1] <- heightsv[1] * as.numeric(x$show.colnames) 
    heights <- unit(heightsv, "mm") 
    cells = viewport(name = "table.cells", layout = grid.layout(lg$nrow + 
     1, lg$ncol + 1, widths = widths, heights = heights)) 
    pushViewport(cells) 
    tg <- gridExtra:::arrangeTableGrobs(lg$lgt, lg$lgf, lg$nrow, lg$ncol, 
     lg$widths, lg$heights, show.colnames = x$show.colnames, 
     show.rownames = x$show.rownames, padding.h = x$padding.h, 
     padding.v = x$padding.v, separator = x$separator, show.box = x$show.box, 
     show.vlines = x$show.vlines, show.hlines = x$show.hlines, 
     show.namesep = x$show.namesep, show.csep = x$show.csep, 
     show.rsep = x$show.rsep) 
    upViewport() 
} 

वैश्विक वातावरण में इस समारोह को परिभाषित करके, यह gridExtra में एक से अधिक प्राथमिकता दी जाएगी। यह हमें तैयार होने से पहले टेबल को कस्टमाइज़ करने की अनुमति देगा और हमारे परिवर्तन रीसेट नहीं हो पाएंगे। आपके अनुरोध के अनुसार पहले दो पंक्तियों में मानों के रंगों को बदलने के लिए कोड यहां दिया गया है।

mytable = as.table(matrix(c("1","2","3","4","5","6","7","8"),ncol=2,byrow=TRUE)) 
mytable = tableGrob(mytable,gpar.coretext = gpar(col = "black", cex = 1)) 

mytable$lg$lgt[[7]]$gp$col <- "red" 
mytable$lg$lgt[[12]]$gp$col <- "blue" 

mydf = data.frame(x = 1:10,y = 1:10) 
ggplot(mydf, aes(x, y)) + annotation_custom(mytable) 

और यह इस साजिश का उत्पादन करता है।

table with color

तो वाक्य रचना थोड़ा गुप्त है, लेकिन मुझे इस लाइन

mytable$lg$lgt[[7]]$gp$col <- "red" 

mytable वस्तु है वास्तव में सिर्फ एक सजाया सूची के साथ स्पष्ट करता हूं। इसमें lg आइटम है जो makeTableGrobs से गणना की गई है और इसमें सभी कच्चे grid तत्व हैं। lgt उसके अंतर्गत तत्व एक और सूची है जिसमें सभी टेक्स्ट परतें हैं। इस तालिका के लिए, lgt में 15 तत्व हैं। तालिका में प्रत्येक वर्ग के लिए एक ऊपरी बाईं ओर "खाली" से शुरू होता है। वे शीर्ष-से-नीचे, बाएं से दाएं क्रम में जाते हैं, इसलिए सूची में 1 वाला [[7]] है। यदि आप str(mytable$lg$lgt[[7]]) चलाते हैं तो आप उस टेक्स्ट ग्रोब को बनाने वाले गुण देख सकते हैं। आप gp के लिए एक अनुभाग भी देखेंगे जहां आप col तत्व के माध्यम से टेक्स्ट का रंग सेट कर सकते हैं। इसलिए हम इसे डिफ़ॉल्ट "काला" से वांछित "लाल" में बदल देते हैं।

हम क्या कर रहे हैं सरकारी एपीआई का हिस्सा इसलिए यह एक हैक विचार किया जाना चाहिए और इस तरह के रूप में शामिल पुस्तकालयों (ggplot2, grid, gridExtra) में भविष्य में परिवर्तन करने के लिए कमजोर हो सकता है नहीं है। लेकिन उम्मीद है कि इससे कम से कम आपको अपनी तालिका को अनुकूलित करने में मदद मिलेगी।

+0

इसके लिए धन्यवाद। बस दूसरों के लिए जोड़ने के लिए, आप पृष्ठभूमि भर को बदलने के लिए इस दृष्टिकोण का उपयोग कर सकते हैं 'mytable $ lg $ lgf [[7]] $ gp $ fill <-" black "' – mrbcuda

6

संपादित

gridExtra> = 2.0 खरोंच से फिर से लिखा गया था, और निम्न स्तर के संपादन अब संभव है। मैं पूर्णता के लिए नीचे पुराना उत्तर छोड़ दूंगा।

मूल जवाब

grid.table Grob के बाद संपादन की अनुमति नहीं है; इसे ग्रिड पैकेज से हाल ही में मेक कॉन्टेक्स्ट रणनीति का उपयोग करके फिर से कार्यान्वित किया जाना चाहिए, लेकिन ऐसा होने की संभावना नहीं है।

यदि आप वास्तव में ग्रिड ग्राफिक्स के आधार पर एक टेबल चाहते हैं, तो संभवतः आप अपने स्वयं के फ़ंक्शन को लिखने से बेहतर हैं। यहाँ एक संभव शुरू,

enter image description here

library(gtable) 

gt <- function(d, colours="black", fill=NA){ 

    label_matrix <- as.matrix(d) 

    nc <- ncol(label_matrix) 
    nr <- nrow(label_matrix) 
    n <- nc*nr 

    colours <- rep(colours, length.out = n) 
    fill <- rep(fill, length.out = n) 

    ## text for each cell 
    labels <- lapply(seq_len(n), function(ii) 
    textGrob(label_matrix[ii], gp=gpar(col=colours[ii]))) 
    label_grobs <- matrix(labels, ncol=nc) 

    ## define the fill background of cells 
    fill <- lapply(seq_len(n), function(ii) 
    rectGrob(gp=gpar(fill=fill[ii]))) 

    ## some calculations of cell sizes 
    row_heights <- function(m){ 
    do.call(unit.c, apply(m, 1, function(l) 
     max(do.call(unit.c, lapply(l, grobHeight))))) 
    } 

    col_widths <- function(m){ 
    do.call(unit.c, apply(m, 2, function(l) 
     max(do.call(unit.c, lapply(l, grobWidth))))) 
    } 

    ## place labels in a gtable 
    g <- gtable_matrix("table", grobs=label_grobs, 
        widths=col_widths(label_grobs) + unit(4,"mm"), 
        heights=row_heights(label_grobs) + unit(4,"mm")) 

    ## add the background 
    g <- gtable_add_grob(g, fill, t=rep(seq_len(nr), each=nc), 
         l=rep(seq_len(nc), nr), z=0, name="fill") 

    g 
} 

d <- head(iris, 3) 

core <- gt(d, 1:5) 
colhead <- gt(t(colnames(d))) 
rowhead <- gt(c("", rownames(d))) 
g <- rbind(colhead, core, size = "first") 
g <- cbind(rowhead, g, size = "last") 
grid.newpage() 
grid.draw(g) 
3

gridExtra> = 2.0 सौंदर्य मानकों के साथ विषय तर्क है, उदा के माध्यम से निर्दिष्ट किया जा सकता है

library(gridExtra) 
library(ggplot2) 
library(grid) 
mytable = as.table(matrix(c("1","2","3","4","5","6","7","8"),ncol=2,byrow=TRUE)) 

cols <- matrix("black", nrow(mytable), ncol(mytable)) 
cols[1,1:2] <- c("blue", "red") 
tt <- ttheme_default(core=list(fg_params = list(col = cols), 
           bg_params = list(col=NA)), 
         rowhead=list(bg_params = list(col=NA)), 
         colhead=list(bg_params = list(col=NA))) 

mytable = tableGrob(mytable, theme = tt) 
mydf = data.frame(x = 1:10,y = 1:10) 
ggplot(mydf, aes(x, y)) + annotation_custom(mytable) 

enter image description here

वैकल्पिक रूप से, grobs may be edited निकालने से पहले।

+0

इसके बजाय आप बिक्री कैसे भरेंगे फ़ॉन्ट का रंग? – user2946746

+0

यह थोड़ा पुराना हो सकता है लेकिन मुझे हाल ही में एक ही समस्या का सामना करना पड़ा जहां मैं एक एकल सेल भरना चाहता हूं। Https://cran.rstudio.com/web/packages/gridExtra/vignettes/tableGrob.html पर विधि मेरे लिए काम नहीं करती है, हालांकि मुझे उपरोक्त बैपटिस्ट के कोड के साथ एक समाधान मिला है। 'cols <- matrix (" black ", nrow (mytable), ncol (mytable)) कोल्स [1,1: 2] <- c (" नीला "," लाल ")' भरें < - मैट्रिक्स ("काला", नीरो (mytable), एनकॉल (mytable)) भरें [1,1: 2] <- सी ("नीला", "लाल") ', फिर 'fill = fill' जोड़ें' bg_params = सूची (col = NA) कोर का हिस्सा काम करेगा – JPHwang