You didn't do what I said..... Once you make the list of data.frame()s "TempData", each single element is a data.frame and that is what you need to pass to ggplot -- in the loop construct I set up, the individual data frame is called temp so you need to have ggplot(temp).
As I said before, ## Do all your stuff -- just change "TestData" to "temp" so you are using the right data.frame I'll be a little more direct this time: for(temp in TempData){ png(filename = paste("plot", unique(temp$key_line), ".png", sep = ""), width=600, height=300) p <- ggplot(temp, aes(value, drug)) + geom_line(size = 6) + xlab("Time") + ylab("") + theme_bw() + opts(title = paste("Pattern = ", unique(temp$pattern), " \n (profile_key = ", unique(temp$profile_key), ", line = ", unique(temp$line), ") \n", sep = "")) + opts(axis.text.x = theme_blank()) print(p) dev.off() } Michael On Fri, Mar 23, 2012 at 10:22 AM, Paul Miller <pjmiller...@yahoo.com> wrote: > Hi Michael and Petr, > > You both seem to have hit on the idea of splitting the TestData in order to > do by group processing. Trouble is that ggplot2 doesn't seem to like lists > very much. > > When I run the code: > > TempData <- split(TestData, TestData$key_line) > TempData > > for(temp in TempData){ > > png(filename = paste("plot", unique(TempData$key_line), ".png", sep = ""), > width=600, height=300) > > ggplot(TempData, aes(value, drug)) + geom_line(size = 6) + xlab("Time") + > ylab("") + theme_bw() + > opts(title = paste("Pattern = ", unique(TempData$pattern), " > \n (profile_key = ", unique(TempData$profile_key), ", line = ", > unique(TempData$line), ") \n", sep = "")) + > opts(axis.text.x = theme_blank() ) > dev.off() > > } > > I get the error message: > > "Error: ggplot2 doesn't know how to deal with data of class list" > > Are there any other good ways of doing the looping? Sorry to trouble you with > this. If I had more time, I'd just struggle with it for awhile and figure it > out myself. > > I tried embedding my ggplot code into print() as Petr suggested. I didn't > think it would help but wanted to try just in case. No dice -- ggplot just > doesn't seem to like lists. > > Thanks, > > Paul > > > > --- On Fri, 3/23/12, R. Michael Weylandt <michael.weyla...@gmail.com> wrote: > >> From: R. Michael Weylandt <michael.weyla...@gmail.com> >> Subject: Re: [R] Plotting patient drug timelines using ggplot2 (or some >> other means) -- Help!!! >> To: "Paul Miller" <pjmiller...@yahoo.com> >> Cc: r-help@r-project.org >> Received: Friday, March 23, 2012, 8:52 AM >> Inline. >> >> On Fri, Mar 23, 2012 at 9:40 AM, Paul Miller <pjmiller...@yahoo.com> >> wrote: >> > Hi Michael, >> > >> > Added a little more to my code (see below). It now >> automatically sets the name of the file. It also does a >> better job of spacing the text for pattern and patient x >> line at the top of the graph. >> > >> > I really like the way this looks now. I just need to >> figure out how to loop through the data using my "key_line" >> (patient x line) variable. >> > >> > One of the things I've noticed while learning R is that >> things I think will be difficult often go surprisingly well. >> It's the things that I think will be easy that I wind up >> struggling with. Right now I'm struggling with figuring out >> how to loop through the data to produce plot11, plot 12, >> plot21, and plot22. >> > >> > Embarassing. But there it is. >> > >> > Can you show me how to do that? In the meantime, I keep >> working on it and may figure it out on my own. >> > >> > Thanks, >> > >> > Paul >> > >> > >> > connection <- textConnection(" >> > 1/1/Drug A/ Begin (A), Begin (B), End (B), End >> (A)/0.0000/21.000 >> > 1/1/Drug B/ Begin (A), Begin (B), End (B), End >> (A)/0.7143/18.000 >> > 1/2/Drug A/ Begin (A, B, C), End (A, B), End >> (C)/0.0000/20.000 >> > 1/2/Drug B/ Begin (A, B, C), End (A, B), End >> (C)/0.0000/20.000 >> > 1/2/Drug C/ Begin (A, B, C), End (A, B), End >> (C)/0.0000/36.000 >> > 2/1/Drug A/ Begin (A, B), End (A, B), Begin (C), End >> (C), Begin (D), End (D)/0.0000/7.429 >> > 2/1/Drug B/ Begin (A, B), End (A, B), Begin (C), End >> (C), Begin (D), End (D)/ 0.0000/7.429 >> > 2/1/Drug C/ Begin (A, B), End (A, B), Begin (C), End >> (C), Begin (D), End (D)/ 14.5714/21.857 >> > 2/1/Drug D/ Begin (A, B), End (A, B), Begin (C), End >> (C), Begin (D), End (D)/ 25.4286/231.286 >> > 2/2/Drug A/ Begin (A, B), End (A, B)/0.0000/35.286 >> > 2/2/Drug B/ Begin (A, B), End (A, B)/0.0000/35.286 >> > ") >> > >> > TestData <- data.frame(scan(connection, >> list(profile_key=0, line=0, drug="", pattern="", >> start_drug=0, stop_drug=0), sep="/")) >> > TestData <- TestData[TestData$profile_key == 1 & >> TestData$line == 1,] >> > TestData >> > >> > require(reshape) >> > TestData <- melt(TestData, measure.vars = >> c("start_drug", "stop_drug")) >> > TestData$drug <- factor(TestData$drug, levels = >> c("Drug D", "Drug C", "Drug B", "Drug A")) >> > TestData$key_line <- >> with(TestData,paste(profile_key, line, sep = "")) >> > TestData >> >> Useful trick: if you use dput() you can send this all in a >> much more >> concise fashion: >> >> structure(list(profile_key = c(1, 1, 1, 1), line = c(1, 1, >> 1, >> 1), drug = structure(c(4L, 3L, 4L, 3L), .Label = c("Drug >> D", >> "Drug C", "Drug B", "Drug A"), class = "factor"), pattern = >> structure(c(4L, >> 4L, 4L, 4L), .Label = c(" Begin (A, B, C), End (A, B), End >> (C)", >> " Begin (A, B), End (A, B)", " Begin (A, B), End (A, B), >> Begin (C), >> End (C), Begin (D), End (D)", >> " Begin (A), Begin (B), End (B), End (A)"), class = >> "factor"), >> variable = structure(c(1L, 1L, 2L, 2L), .Label >> = c("start_drug", >> "stop_drug"), class = "factor"), value = c(0, >> 0.7143, 21, >> 18), key_line = c("11", "11", "11", "11")), >> .Names = c("profile_key", >> "line", "drug", "pattern", "variable", "value", "key_line"), >> row.names = c(NA, >> -4L), class = "data.frame") >> >> >> > >> > require(ggplot2) >> > >> > png(filename = paste("plot", unique(TestData$key_line), >> ".png", sep = ""), width=600, height=300) >> > >> > ggplot(TestData, aes(value, drug)) + geom_line(size = >> 6) + xlab("Time") + ylab("") + theme_bw() + >> > opts(title = paste("Pattern = >> ", unique(TestData$pattern), " \n (profile_key = ", >> unique(TestData$profile_key), ", line = ", >> unique(TestData$line), ") \n", sep = "")) + >> > opts(axis.text.x = >> theme_blank() ) >> > >> > dev.off() >> > >> > >> >> If you want to loop over the different values of "key_line", >> I think >> it's pretty easy: >> >> TempData <- split(TestData, TestData$keyline) # List of >> data frames >> >> for(temp in TempData){ # Loop over the list >> >> ## Do all your stuff -- just change "TestData" to "temp" so >> you are >> using the right data.frame >> >> >> } >> >> Hope this helps, >> >> Michael >> ______________________________________________ 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.