The 'gggrid' package provides two functions: grid_panel()
and grid_group(). Both functions add 'grid' output to
a 'ggplot2' plot.
The grid_panel() function is called once for each panel
in a (facetted) 'ggplot2' plot and the grid_group() function
is called once for each group in a 'ggplot2' plot.
The first argument to both functions can be a 'grid' grob. For example, the following code defines a text grob that will be drawn 5mm in from the top-right corner of wherever it is drawn.
library(grid) label <- textGrob("Label", x=unit(1, "npc") - unit(5, "mm"), y=unit(1, "npc") - unit(5, "mm"), just=c("right", "top"))
The following code calls grid_panel() to add that text label
to a 'ggplot2' plot.
library(gggrid) ggplot(mtcars) + geom_point(aes(disp, mpg)) + grid_panel(label)
The first argument to both functions can also be a function
that generates a grob. The function must accept two arguments,
data and coords, which contain the data values (and transformed
data values) for the 'ggplot2' panel that is being drawn.
For example, the following code adds a "rug" of short lines
showing the distribution of the y-values in the plot.
rug <- function(data, coords) { segmentsGrob(unit(1, "npc"), coords$y, unit(1, "npc") - unit(2, "mm"), coords$y, gp=gpar(lwd=2, col=rgb(0,0,0,.5))) } ggplot(mtcars, aes(x=disp, y=mpg)) + geom_point() + grid_panel(rug)
The following code adds facetting to
demonstrate that grid_panel() is called once
for panel.
ggplot(mtcars, aes(x=disp, y=mpg)) + geom_point() + grid_panel(rug) + facet_wrap("am")
The following code adds grouping to demonstrate that
grid_group() is called once for each group.
rugGroup <- function(data, coords) { segmentsGrob(unit(1, "npc"), coords$y, unit(1, "npc") - unit(2, "mm"), coords$y, gp=gpar(lwd=2, col=adjustcolor(data$colour, alpha=.5))) } ggplot(mtcars, aes(x=disp, y=mpg, colour=as.factor(am))) + geom_point() + grid_group(rugGroup)
The following code demonstrates that 'gggrid' is one way to access
'grid'-based drawing that is not (yet) available via 'ggplot2'-based
geom_*() functions. In this case, we make use of variable-width
lines from the 'vwline' package.
minard <- read.table("minard-troops.txt", header=TRUE) library(vwline) path <- function(data, coords) { vwlineGrob(coords$x, coords$y, w=unit(coords$size, "in"), gp=gpar(col=coords$colour[1], fill=adjustcolor(coords$colour[1], alpha=.5))) } ggplot(minard, aes(x=long, y=lat, size=survivors, colour=direction, group=interaction(group, direction))) + scale_size(range=c(.01, .5)) + coord_fixed(2, clip="off") + grid_group(path)
The above plot has no legend, but it is possible to add one with a little more work. There are three important steps:
show.legend=TRUEkey_glyph to be a function that produces a grob
(to draw an item in the legend)grid_group() call
(rather than just having grid_group() inherit a mapping).The following code demonstrates these steps, including defining
a path_key() function that draws a variable-width line
in the legend, to show the relationship between colour
and direction.
We have excluded the size legend in this case
(with guide="none") to keep the path_key() function relatively simple.
path_key <- function(data, ...) { vwlineGrob(0:1, c(.5, .5), w=unit(c(.1, .2), "in"), gp=gpar(col=data$colour, fill=adjustcolor(data$colour, alpha=.5))) } ggplot(minard) + scale_size(range=c(.01, .5), guide="none") + coord_fixed(2, clip="off") + grid_group(path, aes(x=long, y=lat, size=survivors, colour=direction, group=interaction(group, direction)), show.legend=TRUE, key_glyph=path_key)
The Minard data used in the example above comes from the supplementary materials that were published with @wickham-GoG.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.