1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
# By default, the group is set to the interaction of all discrete variables in the # plot. This often partitions the data correctly, but when it does not, or when # no discrete variable is used in the plot, you will need to explicitly define the # grouping structure, by mapping group to a variable that has a different value # for each group. # For most applications you can simply specify the grouping with # various aesthetics (colour, shape, fill, linetype) or with facets. p <- ggplot(mtcars, aes(wt, mpg)) # A basic scatter plot p + geom_point(size = 4) # The colour aesthetic p + geom_point(aes(colour = factor(cyl)), size = 4) # Or you can use shape to distinguish the data p + geom_point(aes(shape = factor(cyl)), size = 4) # Using fill a <- ggplot(mtcars, aes(factor(cyl))) a + geom_bar() a + geom_bar(aes(fill = factor(cyl))) a + geom_bar(aes(fill = factor(vs))) # Using linetypes rescale01 <- function(x) (x - min(x)) / diff(range(x)) ec_scaled <- data.frame( date = economics$date, plyr::colwise(rescale01)(economics[, -(1:2)])) ecm <- reshape2::melt(ec_scaled, id.vars = "date") f <- ggplot(ecm, aes(date, value)) f + geom_line(aes(linetype = variable)) # Using facets k <- ggplot(diamonds, aes(carat, ..density..)) + geom_histogram(binwidth = 0.2) k + facet_grid(. ~ cut) # There are three common cases where the default is not enough, and we # will consider each one below. In the following examples, we will use a simple # longitudinal dataset, Oxboys, from the nlme package. It records the heights # (height) and centered ages (age) of 26 boys (Subject), measured on nine # occasions (Occasion). # Multiple groups with one aesthetic h <- ggplot(nlme::Oxboys, aes(age, height)) # A single line tries to connect all the observations h + geom_line() # The group aesthetic maps a different line for each subject h + geom_line(aes(group = Subject)) # Different groups on different layers h <- h + geom_line(aes(group = Subject)) # Using the group aesthetic with both geom_line() and geom_smooth() # groups the data the same way for both layers h + geom_smooth(aes(group = Subject), method = "lm", se = FALSE) # Changing the group aesthetic for the smoother layer # fits a single line of best fit across all boys h + geom_smooth(aes(group = 1), size = 2, method = "lm", se = FALSE) # Overriding the default grouping # The plot has a discrete scale but you want to draw lines that connect across # groups. This is the strategy used in interaction plots, profile plots, and parallel # coordinate plots, among others. For example, we draw boxplots of height at # each measurement occasion boysbox <- ggplot(nlme::Oxboys, aes(Occasion, height)) boysbox + geom_boxplot() # There is no need to specify the group aesthetic here; the default grouping # works because occasion is a discrete variable. To overlay individual trajectories # we again need to override the default grouping for that layer with aes(group = Subject) boysbox <- boysbox + geom_boxplot() boysbox + geom_line(aes(group = Subject), colour = "blue")
Want to suggest features or report bugs for rdrr.io? Use the GitHub issue tracker.