I'd like to create a faceted plot with margins in ggplot2. However, I'd like the margin plot to have colours according to from which facet the particular point has been derived. It's probably best illustrated with an example:
library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + facet_grid(.~gear, margins = TRUE)
Within the margin plot labelled as "(all)", I want those dots that have "gear = 3" to be plotted with one colour, those with "gear = 4" with a second colour, and those with "gear = 5" with a third one.
This one doesn't do the job:
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point(aes(col=gear))
p + facet_grid(.~gear, margins = TRUE)
Is there a way to achieve what I want?
How about creating a new variable as a reference and colour the points by that? Seems to work provided you don't mind the points in the first 3 facets being coloured too.
mtcars$ref <- as.factor(mtcars$gear)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point(aes(col=as.factor(gear)))
p + facet_grid(.~ref, margins = TRUE)
EDIT: I have managed to get it to remove the colour key from the first 3 facets but not without playing around with the original data;
Duplicate the original data (so there are 2 of each record) then instead of using a margin plot to produce the "all" facet, using the redundant records instead.
library(ggplot2)
mtcars$ref <- (mtcars$gear)
# create the duplicate
dat <- do.call("rbind", replicate(2, mtcars, simplify = FALSE))
# give the duplicates a false value for "gear" so they can be plotted together
#This value can then be used for faceting, grouping everything with "all".
dat$ref[1:32] <- "all"
# where not in the "all" facet, change "gear" to one (so they are plotted with the same colour)
dat$gear[dat$ref != "all"] <- 1
# then plot using ref as the facet and gear to colour points.
p <- ggplot(dat, aes(mpg, wt)) + geom_point(aes(col=as.factor(gear)))
p + facet_grid(.~ref, margins = F)
I'm not sure that's the best way to go about it but perhaps someone with more expertise might be able to advise?