Hi: I think it would be tough to do that in qplot(), but it's easier in ggplot(), even if you don't add the mean information to the data frame. Here's one way - use the three person data frame (call it dat1) and the mean.y data frame that you created from aggregate() without adding the factor info as follows:
# Set up the framework of the plot: g <- ggplot(dat1, aes(x = time, y = y, groups = ID, colour = ID)) # This associates colors with groups. Next, add the points and # lines from dat1 and then add the mean data with a separate # geom_line() call, where the mean line is about twice as thick: g + geom_point(size = 2) + geom_line() + geom_line(data = mean.y, aes(x = time, y = y, colour = 'mean'), size = 1.5) # Notice how the name 'mean' that we associated with colour got into the # legend. This is because we *mapped* the same aesthetic (color) in the second # geom_line() call to the one existing for IDs. ggplot2 is smart enough to pick # this up. [We just have to be smart enough to realize it :)]. To exert more # control over line colors, add the following: last_plot() + scale_colour_manual(values = c('1' = 'red', '2' = 'green', '3' = 'blue', 'mean' = 'black')) The LHS is the value of ID, the RHS the color to associate with it. As usual, it took me about five iterations of scale_* to get it right :) The line thicknesses in the scale are all the same as the thickest, but I see that as a feature rather than a bug :) One more comment below. On Mon, Aug 23, 2010 at 6:20 PM, Kingsford Jones <kingsfordjo...@gmail.com>wrote: > On Mon, Aug 23, 2010 at 6:19 PM, Dennis Murphy <djmu...@gmail.com> wrote: > > > > This is an excellent idea - the only snag might occur if someone wants > > the mean line to be thicker :) > > fortunately, with your lattice solution this is easily accomplished by > passing a vector to lwd: > > i <- c(1, 1, 1, 3) > I was going to do that, too, but I used 1.5 instead of 3, saw no material difference, and gave up...should have kept trying, huh? HTH, Dennis > mykey <- list(space = 'right', > title = 'ID', > cex.title = 1.2, > text = list(levels(dat$ID), cex = 0.8), > lines = list(lty = i, lwd = i, col = 1:4)) > > xyplot(y ~ time, data = dat, lty = i, lwd = i, col.lines = 1:4, col = 1:4, > groups = ID, type = c('g', 'p', 'l'), key = mykey) > > > but I didn't have luck trying the same with qplot: > > > qplot(time, y, data = dat, group = ID, color = ID, > + geom = c('point', 'line'), lty = i, lwd = i) > Error in data.frame(colour = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, : > arguments imply differing number of rows: 18, 4 > > perhaps using the construct ggplot(...) + geom_line(...) would be more > fruitful? > > King > > > > > > Having said that, it's usually easier to > > 'fix' the > > problem externally in the data rather than to fiddle with graphics > commands. > > > >> > >> #the original data (no replicates within time points) > >> dat <- structure(list(ID = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 2L), > >> .Label = c("1", "2"), class = "factor"), > >> time = c(1, 2, 3, 1.5, 4, 5.5, 6), > >> y = c(1.4, 2, 2.5, 2.3, 4.5, 1.6, 2)), > >> .Names = c("ID", "time", "y"), > >> row.names = c(NA, -7L), class = "data.frame") > >> > >> #adding another subject to introduce replicates > >> id3 <- data.frame(ID=as.factor(rep(3, 4)),time = c(1, 1.5, 2, 5.5), > >> y = c(1, 2.2, 3, 2)) > >> dat <- rbind(dat, id3) > >> mean.y <- aggregate(formula = y ~ time, data = dat, FUN = mean) > >> mean.y <- cbind(ID = as.factor('mean'), mean.y) > >> dat <- rbind(dat, mean.y) > >> dat > >> library(ggplot2) > >> qplot(time, y, data=dat, group = ID, color = ID, geom = c('point', > >> 'line')) > > > > A lattice version with a legend is: > > > > mykey <- list(space = 'right', > > title = 'ID', > > cex.title = 1.2, > > text = list(levels(dat$ID), cex = 0.8), > > lines = list(lty = 1, col = 1:4)) > > > > xyplot(y ~ time, data = dat, lty = 1, col.lines = 1:4, col = 1:4, > > groups = ID, type = c('g', 'p', 'l'), key = mykey) > > > > Defining the key externally modularizes the problem, lets one define > > the features one wants to contain, and simplifies the high-level > > xyplot() call. > > > > There is a type = 'a' (shorthand for panel.average()) that can be > > used to good effect in xyplot(), but it creates 'holes' where missing > > data reside, so taking care of the problem externally at the data > > level is much cleaner. > > > > HTH, > > Dennis > > > >> > >> best, > >> > >> Kingsford Jones > >> > >> ______________________________________________ > >> R-help@r-project.org mailing list > >> https://stat.ethz.ch/mailman/listinfo/r-help > >> PLEASE do read the posting guide > >> http://www.R-project.org/posting-guide.html > >> and provide commented, minimal, self-contained, reproducible code. > > > > > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.