Zu meiner Enttäuschung scheint dies nicht einfach zu sein. Die tableGrob
-Funktion ruft makeTableGrobs
auf, um das Rasterobjekt zu erstellen, und gibt eine vollständig berechnete Struktur gTree
zurück. Es wäre schön, wenn Sie das abfangen, einige Eigenschaften ändern und weitermachen könnten; Leider wird die Zeichnung mit gridExtra:::drawDetails.table
gemacht und diese Funktion besteht darauf, wieder makeTableGrobs
aufzurufen, was jede Möglichkeit zur Anpassung im Wesentlichen zunichte macht.
Aber es ist nicht unmöglich. Grundsätzlich können wir unsere eigene Version von drawDetails.table
erstellen, die die erneute Verarbeitung nicht durchführt. Hier ist die Funktion von gridExtra
mit einer zusätzlichen if
Aussage zu Beginn.
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()
}
Durch diese Funktion im globalen Umfeld zu definieren, wird es Vorrang vor dem in gridExtra
nehmen. Dadurch können wir die Tabelle anpassen, bevor sie gezeichnet wird, und unsere Änderungen werden nicht zurückgesetzt. Hier ist Code, um die Farben der Werte in den ersten zwei Zeilen wie gewünscht zu ändern.
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)
Und das erzeugt diese Handlung.
So ist die Syntax ein wenig kryptisch, aber lassen Sie mich mit dieser Linie erklären
mytable$lg$lgt[[7]]$gp$col <- "red"
Das mytable
Objekt ist wirklich nur ein dekorierter Liste. Es hat einen lg
Artikel, der aus makeTableGrobs
berechnet wird und alle rohen grid
Elemente enthält. Das lgt
Element darunter ist eine andere Liste, die alle Textebenen enthält. Für diese Tabelle hat lgt
15 Elemente. Eins für jedes Quadrat in der Tabelle beginnend mit dem "leeren" in der oberen linken Ecke. Sie gehen von oben nach unten, von links nach rechts, also ist die Zelle mit 1 [[7]]
in der Liste. Wenn Sie str(mytable$lg$lgt[[7]])
ausführen, können Sie die Eigenschaften sehen, aus denen dieser Text grob besteht. Sie werden auch einen Abschnitt für gp
bemerken, wo Sie die Farbe des Textes über das Element col
festlegen können. Also ändern wir es vom Standard "schwarz" zum gewünschten "rot".
Was wir tun, ist nicht Teil der offiziellen API, so dass es einen Hack in Betracht gezogen werden soll und können als solche in den Bibliotheken beteiligt (ggplot2
, grid
, gridExtra
) auf zukünftige Änderungen zerbrechlich sein. Aber hoffentlich hilft Ihnen das zumindest bei der Anpassung Ihrer Tabelle.
Danke dafür. Nur um für andere hinzuzufügen, können Sie diesen Ansatz verwenden, um die Hintergrundfüllung zu ändern. 'mytable $ lg $ lgf [[7]] $ gp $ fill <-" schwarz "' – mrbcuda