I'm using the
gridSVG package to export garnished plots: that is, plots that have additional SVG attributes relating to their original data. So a barplot might have individual bars that, in the SVG, look like:
<rect xmlns="http://www.w3.org/2000/svg" id="geom_rect.rect.214.1.11" x="308.05" y="236.07" width="9.58" height="67.65" transform="" stroke="none" fill="rgb(89,89,89)" stroke-width="1.07" stroke-dasharray="none" stroke-linecap="butt" stroke-opacity="0" fill-opacity="1" data_t="11" data_y="0.871303487786997"/>
The last two,
data_y, are garnished in using code like this reprex:
library(tidyverse) library(grid) library(gridExtra) library(gridSVG) # generate test data and barplot testdata = data_frame(t = 1:40, y = rnorm(40)) bp = ggplot(testdata) + geom_col(aes(x = t, y = y)) # garnish plot with the original data, then export bpg = bp %>% ggplotGrob() %>% grid.force() dev.new(width = 8, height = 4.5, units = 'in') grid.draw(bpg) grid.garnish('geom_rect', data_t = testdata$t, data_y = testdata$y, group = FALSE, grep = TRUE, redraw = TRUE) grid.export('test_garnished_naive.svg', strict = FALSE)
The particularly powerful part of
grid.garnish is that you can give it vectors, so that instead of garnishing the parent grob with a single value, it garnishes each child grob (say, each bar with its original value for a given aesthetic).
However, I naively assumed that those children would be ordered in the SVG output the same way they are in the dataset I gave to ggplot2 (
testdata). That isn't the case: in both this reprex and my own work, bars with negative y values precede bars with positive ones, so the data frame columns no longer match up with the child grobs.
Does anyone know if there's a way for me to tell how
grid orders the geom elements? I'm thinking the
draw_panel function for
GeomRect in geom-rect.r is where I want to look, but I'm not sure how to get breakpoints into internal ggplot2 code to have a look.