मेरी निराशा के लिए, यह आसान प्रतीत नहीं होता है। 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)
और यह इस साजिश का उत्पादन करता है।
तो वाक्य रचना थोड़ा गुप्त है, लेकिन मुझे इस लाइन
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
) में भविष्य में परिवर्तन करने के लिए कमजोर हो सकता है नहीं है। लेकिन उम्मीद है कि इससे कम से कम आपको अपनी तालिका को अनुकूलित करने में मदद मिलेगी।
इसके लिए धन्यवाद। बस दूसरों के लिए जोड़ने के लिए, आप पृष्ठभूमि भर को बदलने के लिए इस दृष्टिकोण का उपयोग कर सकते हैं 'mytable $ lg $ lgf [[7]] $ gp $ fill <-" black "' – mrbcuda