Re: [R] Time vs Concentration Graphs by ID
I tried that too, it doesn't work because of the way I wrote the code. Listing y as free or not giving it a limit makes the scale go from -0.5 to 0.5, which is useless. This is what my code looks like now (it's S-Plus code, btw)-- I'll try reading up on lattices in R to see if I can come up with something better. par(mfrow = c(2,2)) unique.id - unique(d1$ID) unique.id - sort(unique.id) for(j in unique.id){ temp.id - d1[d1$ID==j,] unique.dose -unique(temp.id$DOSE) plot(0,0,type=n, xlab= Time (hr),ylab=Concentration (ug/L), xlim=c(0,32),ylim=c(0,200), main=paste(ID,j) ) for(i in unique.dose){ temp.subanddose - temp.id[temp.id$DOSE==5,] points(temp.subanddose$TAD, temp.subanddose$DV,col=1,pch=1,) points(temp.subanddose$TAD, temp.subanddose$IPRE,type=l,col=1)} for(i in unique.dose){ temp.subanddose - temp.id[temp.id$DOSE==7,] points(temp.subanddose$TAD, temp.subanddose$DV,col=2,pch=2,) points(temp.subanddose$TAD, temp.subanddose$IPRE,type=l,col=2)} for(i in unique.dose){ temp.subanddose - temp.id[temp.id$DOSE==10,] points(temp.subanddose$TAD, temp.subanddose$DV,col=3,pch=3,) points(temp.subanddose$TAD, temp.subanddose$IPRE,type=l,col=3)} key(text=list(c(5 mg, 7 mg, 10 mg)),lines=list(type=rep (l,3),col=1:3),border=T,corner=c(1,1)) } On Fri, Oct 15, 2010 at 1:31 AM, David Winsemius dwinsem...@comcast.netwrote: On Oct 15, 2010, at 3:46 AM, Anh Nguyen wrote: Hello Dennis, That's a very good suggestion. I've attached a template here as a .png file, I hope you can view it. This is what I've managed to achieve in S-Plus (we use S-Plus at work but I also use R because there's some very good R packages for PK data that I want to take advantage of that is not available in S-Plus). The only problem with this is, unfortunately, I cannot figure out how make the scale non-uniform and I hope to fix that. That would be easy if your efforts which I have not yet seen were in lattice. If htat were the case then adding this would solve you problem: scales=list(y=list(relation=free) -- David My data looks like this: IDDose Time Conc Pred ... 1 5 0 00 1 5 0.5 68 1 5 1 16 20 ... 1 7 0 00 1 7 0.5 10 12 1 7 1 20 19 ... 110 3 60 55 ... 2512 4 2 ... ect I don't care if it's ggplot or something else as long as it looks like how I envisioned. On Fri, Oct 15, 2010 at 12:22 AM, Dennis Murphy djmu...@gmail.com wrote: I don't recall that you submitted a reproducible example to use as a template for assistance. Ista was kind enough to offer a potential solution, but it was an abstraction based on the limited information provided in your previous mail. If you need help, please provide an example data set that illustrates the problems you're encountering and what you hope to achieve - your chances of a successful resolution will be much higher when you do. BTW, there's a dedicated newsgroup for ggplot2: look for the mailing list link at http://had.co.nz/ggplot2/ HTH, Dennis On Thu, Oct 14, 2010 at 10:02 PM, Anh Nguyen eataban...@gmail.com wrote: I found 2 problems with this method: - There is only one line for predicted dose at 5 mg. - The different doses are 5, 7, and 10 mg but somehow there is a legend for 5,6,7,8,9,10. - Is there a way to make the line smooth? - The plots are also getting a little crowded and I was wondering if there a way to split it into 2 or more pages? Thanks for your help. On Thu, Oct 14, 2010 at 8:09 PM, Ista Zahn iz...@psych.rochester.edu wrote: Hi, Assuming the data is in a data.frame named D, something like library(ggplot2) # May need install.packages(ggplot2) first ggplot(D, aes(x=Time, y=Concentration, color=Dose) + geom_point() + geom_line(aes(y = PredictedConcentration, group=1)) + facet_wrap(~ID, scales=free, ncol=3) should do it. -Ista On Thu, Oct 14, 2010 at 10:25 PM, thaliagoo eataban...@gmail.com wrote: Hello-- I have a data for small population who took 1 drug at 3 different doses. I have the actual drug concentrations as well as predicted concentrations by my model. This is what I'm looking for: - Time vs Concentration by ID (individual plots), with each subject occupying 1 plot -- there is to be 9 plots per page (3x3) - Observed drug concentration is made up of points, and predicted drug concentration is a curve without points. Points and curve will be the same color for each dose. Different doses will have different colors. - A legend to specify which color correlates to which dose. - Axes should be different for each individual (as some individual will
Re: [R] Time vs Concentration Graphs by ID
Thank you for the very helpful tips. Just one last question: - In the lattice method, how can I plot TIME vs OBSconcentration and TIME vs PREDconcentration in one graph (per individual)? You said in lattice you would replace 'smooth' by 'l' in the type = argument of xyplot() that just means now the OBSconc is replaced by a line instead of points and PREDconc is not plotted, right? -- I tried to superimpose 2 lattices but that won't work. I can keep the x-scale the same but not the y-scale. Ex: max pred conc = 60 and max obs conc = 80 and thus for this case, there would be 2 different y-scales superimposed on one another. - the ggplot2 method works, just the weird 5,6,7,8,9,10 mg legends (there are only 5,7,10 mg doses) but it's nothing that photoshop can't take care of. This is very cool, I think I understand it a lot better now. It was a lot easier than what I was doing before, that's for sure. Thanks! On Fri, Oct 15, 2010 at 2:32 AM, Dennis Murphy djmu...@gmail.com wrote: Hi: To get the plots precisely as you have given them in your png file, you're most likely going to have to use base graphics, especially if you want a separate legend in each panel. Packages ggplot2 and lattice have more structured ways of constructing such graphs, so you give up a bit of freedom in the details of plot construction to get nicer default configurations. Perhaps you've written a panel function in S-PLUS (?) to produce each graph in your png file - if so, you could simply add a couple of lines to determine the max y-value and from that the limits of the y scale. It shouldn't be at all difficult to make such modifications. Since R base graphics is very similar to base graphics in S-PLUS, you could possibly get away with popping your S-PLUS code directly into R and see how far that takes you. Lattice is based on Trellis graphics, but the syntax in lattice has changed a fair bit vis a vis Trellis as the package has developed. ggplot2 is a more recent graphics system in R predicated on the grammar of graphics exposited by Leland Wilkinson. For my example, I've modified the Theophylline data set in package nlme, described in Pinheiro Bates (2000), Mixed Effects Models in S and S-PLUS, Springer. The original data set has eleven unique doses - I combined them into three intervals and converted them to factor with cut(). I also created four groups of Subjects and put them into a variable ID. The output data frame is called theo. I didn't fit the nlme models to the subjects - instead, I was lazy and used loess smoothing instead. The code to generate the data frame is given below; this is what we mean by a 'reproducible example', something that can be copied and pasted into an R session. # Use modified version of Theophylline data in package nlme library(nlme) theo - Theoph theo - subset(theo, Dose 3.5) theo$dose - cut(theo$Dose, breaks = c(3, 4.5, 5, 6), labels = c('4.25', '4.8', '5.5')) theo - as.data.frame(theo) theo$ID - with(theo, ifelse(Subject %in% c(6, 7, 12), 1, ifelse(Subject %in% c(2, 8, 10), 2, ifelse(Subject %in% c(4, 11, 5), 3, 4) ))) # ID is used for faceting, dose for color and shape # lattice version: xyplot(conc ~ Time | factor(ID), data = theo, col.line = 1:3, pch = 1:3, col = 1:3, groups = dose, type = c('p', 'smooth'), scales = list(y = list(relation = 'free')), auto.key = list(corner = c(0.93, 0.4), lines = TRUE, points = TRUE, text = levels(theo$dose)) ) # ggplot2 version: # scales = 'free_y' allows independent y scales per panel g - ggplot(theo, aes(x = Time, y = conc, shape = dose, colour = dose, group = Subject)) g + geom_point() + geom_smooth(method = 'loess', se = FALSE) + facet_wrap( ~ ID, ncol = 2, scales = 'free_y') + opts(legend.position = c(0.9, 0.4)) This is meant to give you some indication how the two graphics systems work - it's a foundation, not an end product. There are a couple of ways I could have adjusted the y-scales in the lattice graphs (either directly in the scales = ... part or to use a prepanel function for loess), but since you're not likely to use loess in your plots, it's not an important consideration. Both ggplot2 and lattice place the legend outside the plot area by default; I've illustrated a couple of ways to pull it into the plot region FYI. One other thing: if your data set contains fitted values from your PK models for each subject * dose combination, the loess smoothing is unnecessary. In ggplot2, you would use geom_line(aes(y = pred), ...) in place of geom_smooth(), and in lattice you would replace 'smooth' by 'l' in the type = argument of xyplot(). HTH, Dennis On Fri, Oct 15, 2010 at 12:46 AM, Anh Nguyen eataban...@gmail.com wrote: Hello Dennis, That's a very good suggestion. I've attached a template here as a .png file, I hope you can view it. This
Re: [R] Time vs Concentration Graphs by ID
On Fri, Oct 15, 2010 at 7:29 AM, Anh Nguyen eataban...@gmail.com wrote: Thank you for the very helpful tips. Just one last question: - In the lattice method, how can I plot TIME vs OBSconcentration and TIME vs PREDconcentration in one graph (per individual)? You said in lattice you would replace 'smooth' by 'l' in the type = argument of xyplot() that just means now the OBSconc is replaced by a line instead of points and PREDconc is not plotted, right? -- I tried to superimpose 2 lattices but that won't work. I can keep the x-scale the same but not the y-scale. Ex: max pred conc = 60 and max obs conc = 80 and thus for this case, there would be 2 different y-scales superimposed on one another. - the ggplot2 method works, just the weird 5,6,7,8,9,10 mg legends (there are only 5,7,10 mg doses) but it's nothing that photoshop can't take care of. No need to resort to photoshop... see the breaks argument of ?scale_x_continous -Ista This is very cool, I think I understand it a lot better now. It was a lot easier than what I was doing before, that's for sure. Thanks! On Fri, Oct 15, 2010 at 2:32 AM, Dennis Murphy djmu...@gmail.com wrote: Hi: To get the plots precisely as you have given them in your png file, you're most likely going to have to use base graphics, especially if you want a separate legend in each panel. Packages ggplot2 and lattice have more structured ways of constructing such graphs, so you give up a bit of freedom in the details of plot construction to get nicer default configurations. Perhaps you've written a panel function in S-PLUS (?) to produce each graph in your png file - if so, you could simply add a couple of lines to determine the max y-value and from that the limits of the y scale. It shouldn't be at all difficult to make such modifications. Since R base graphics is very similar to base graphics in S-PLUS, you could possibly get away with popping your S-PLUS code directly into R and see how far that takes you. Lattice is based on Trellis graphics, but the syntax in lattice has changed a fair bit vis a vis Trellis as the package has developed. ggplot2 is a more recent graphics system in R predicated on the grammar of graphics exposited by Leland Wilkinson. For my example, I've modified the Theophylline data set in package nlme, described in Pinheiro Bates (2000), Mixed Effects Models in S and S-PLUS, Springer. The original data set has eleven unique doses - I combined them into three intervals and converted them to factor with cut(). I also created four groups of Subjects and put them into a variable ID. The output data frame is called theo. I didn't fit the nlme models to the subjects - instead, I was lazy and used loess smoothing instead. The code to generate the data frame is given below; this is what we mean by a 'reproducible example', something that can be copied and pasted into an R session. # Use modified version of Theophylline data in package nlme library(nlme) theo - Theoph theo - subset(theo, Dose 3.5) theo$dose - cut(theo$Dose, breaks = c(3, 4.5, 5, 6), labels = c('4.25', '4.8', '5.5')) theo - as.data.frame(theo) theo$ID - with(theo, ifelse(Subject %in% c(6, 7, 12), 1, ifelse(Subject %in% c(2, 8, 10), 2, ifelse(Subject %in% c(4, 11, 5), 3, 4) ))) # ID is used for faceting, dose for color and shape # lattice version: xyplot(conc ~ Time | factor(ID), data = theo, col.line = 1:3, pch = 1:3, col = 1:3, groups = dose, type = c('p', 'smooth'), scales = list(y = list(relation = 'free')), auto.key = list(corner = c(0.93, 0.4), lines = TRUE, points = TRUE, text = levels(theo$dose)) ) # ggplot2 version: # scales = 'free_y' allows independent y scales per panel g - ggplot(theo, aes(x = Time, y = conc, shape = dose, colour = dose, group = Subject)) g + geom_point() + geom_smooth(method = 'loess', se = FALSE) + facet_wrap( ~ ID, ncol = 2, scales = 'free_y') + opts(legend.position = c(0.9, 0.4)) This is meant to give you some indication how the two graphics systems work - it's a foundation, not an end product. There are a couple of ways I could have adjusted the y-scales in the lattice graphs (either directly in the scales = ... part or to use a prepanel function for loess), but since you're not likely to use loess in your plots, it's not an important consideration. Both ggplot2 and lattice place the legend outside the plot area by default; I've illustrated a couple of ways to pull it into the plot region FYI. One other thing: if your data set contains fitted values from your PK models for each subject * dose combination, the loess smoothing is unnecessary. In ggplot2, you would use geom_line(aes(y = pred), ...) in place of geom_smooth(), and in lattice you would replace 'smooth' by 'l' in the type = argument of xyplot(). HTH, Dennis On Fri, Oct 15, 2010
Re: [R] Time vs Concentration Graphs by ID
Hi: On Fri, Oct 15, 2010 at 4:29 AM, Anh Nguyen eataban...@gmail.com wrote: Thank you for the very helpful tips. Just one last question: - In the lattice method, how can I plot TIME vs OBSconcentration and TIME vs PREDconcentration in one graph (per individual)? You said in lattice you would replace 'smooth' by 'l' in the type = argument of xyplot() that just means now the OBSconc is replaced by a line instead of points and PREDconc is not plotted, right? My mistake. That requires a little trickery. Try using both observed and predicted as responses in the xyplot, as in xyplot(conc + pred ~ Time | ID, ..., type = c('p', 'l'), distribute.type = TRUE, ...) where the ... refers to the other arguments in the xyplot() call. If that works (and that *is* an if since it's untested), then conc should be plotted as points and pred as lines on the same (x, y) scale. See section 5.3 of the Lattice book by Deepayan Sarkar; the code for the book example is on its web site: http://lmdvr.r-forge.r-project.org/figures/figures.html The figure in question is Figure 5.12, but it uses data from several previous figures, so you might just want to copy and paste everything from just before Figure 5.10 up to it - the data frame in use is SeatacWeather. -- I tried to superimpose 2 lattices but that won't work. No, it won't. You might be able to get away with that in base graphics (add = TRUE or lines/points), but not in Lattice. Actually, ggplot2 is better positioned to handle that case 'easily'. I can keep the x-scale the same but not the y-scale. Ex: max pred conc = 60 and max obs conc = 80 and thus for this case, there would be 2 different y-scales superimposed on one another. You may need to plot concentration first if it has the higher y limit. No guarantee that will work, but it's worth a shot. If it fails, you can set the y-limits per panel manually using scales, something like scales = list(y = list(limits = list(c(0, 60), c(0, 80), c(0, 60), c(0, 60 in panel order, but again, that's untested and I'm not certain it would work. Better solutions/corrections welcome. - the ggplot2 method works, just the weird 5,6,7,8,9,10 mg legends (there are only 5,7,10 mg doses) but it's nothing that photoshop can't take care of. You must have dose as numeric in your input data frame. If you convert it to factor (e.g, with a new variable) and use the factor version of dose in ggplot2, it should work. This is very cool, I think I understand it a lot better now. It was a lot easier than what I was doing before, that's for sure. Thanks! For complex requests like these, it *really* helps to have a template data frame to work with. It took me about a half hour to rearrange the Theoph data frame from nlme into shape so that I could get a plot that remotely resembled what you were looking for. Alas, I don't have the time today to do the same for this request. HTH, Dennis On Fri, Oct 15, 2010 at 2:32 AM, Dennis Murphy djmu...@gmail.com wrote: Hi: To get the plots precisely as you have given them in your png file, you're most likely going to have to use base graphics, especially if you want a separate legend in each panel. Packages ggplot2 and lattice have more structured ways of constructing such graphs, so you give up a bit of freedom in the details of plot construction to get nicer default configurations. Perhaps you've written a panel function in S-PLUS (?) to produce each graph in your png file - if so, you could simply add a couple of lines to determine the max y-value and from that the limits of the y scale. It shouldn't be at all difficult to make such modifications. Since R base graphics is very similar to base graphics in S-PLUS, you could possibly get away with popping your S-PLUS code directly into R and see how far that takes you. Lattice is based on Trellis graphics, but the syntax in lattice has changed a fair bit vis a vis Trellis as the package has developed. ggplot2 is a more recent graphics system in R predicated on the grammar of graphics exposited by Leland Wilkinson. For my example, I've modified the Theophylline data set in package nlme, described in Pinheiro Bates (2000), Mixed Effects Models in S and S-PLUS, Springer. The original data set has eleven unique doses - I combined them into three intervals and converted them to factor with cut(). I also created four groups of Subjects and put them into a variable ID. The output data frame is called theo. I didn't fit the nlme models to the subjects - instead, I was lazy and used loess smoothing instead. The code to generate the data frame is given below; this is what we mean by a 'reproducible example', something that can be copied and pasted into an R session. # Use modified version of Theophylline data in package nlme library(nlme) theo - Theoph theo - subset(theo, Dose 3.5) theo$dose - cut(theo$Dose, breaks = c(3, 4.5, 5, 6), labels = c('4.25', '4.8', '5.5')) theo -
Re: [R] Time vs Concentration Graphs by ID
I found 2 problems with this method: - There is only one line for predicted dose at 5 mg. - The different doses are 5, 7, and 10 mg but somehow there is a legend for 5,6,7,8,9,10. - Is there a way to make the line smooth? - The plots are also getting a little crowded and I was wondering if there a way to split it into 2 or more pages? Thanks for your help. On Thu, Oct 14, 2010 at 8:09 PM, Ista Zahn iz...@psych.rochester.eduwrote: Hi, Assuming the data is in a data.frame named D, something like library(ggplot2) # May need install.packages(ggplot2) first ggplot(D, aes(x=Time, y=Concentration, color=Dose) + geom_point() + geom_line(aes(y = PredictedConcentration, group=1)) + facet_wrap(~ID, scales=free, ncol=3) should do it. -Ista On Thu, Oct 14, 2010 at 10:25 PM, thaliagoo eataban...@gmail.com wrote: Hello-- I have a data for small population who took 1 drug at 3 different doses. I have the actual drug concentrations as well as predicted concentrations by my model. This is what I'm looking for: - Time vs Concentration by ID (individual plots), with each subject occupying 1 plot -- there is to be 9 plots per page (3x3) - Observed drug concentration is made up of points, and predicted drug concentration is a curve without points. Points and curve will be the same color for each dose. Different doses will have different colors. - A legend to specify which color correlates to which dose. - Axes should be different for each individual (as some individual will have much higher drug concentration than others) and I want to see in detail how well predicted data fits observed data. Any help would be greatly appreciated. -- View this message in context: http://r.789695.n4.nabble.com/Time-vs-Concentration-Graphs-by-ID-tp2996431p2996431.html Sent from the R help mailing list archive at Nabble.com. __ 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. -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org [[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.
Re: [R] Time vs Concentration Graphs by ID
Hello Dennis, That's a very good suggestion. I've attached a template here as a .png file, I hope you can view it. This is what I've managed to achieve in S-Plus (we use S-Plus at work but I also use R because there's some very good R packages for PK data that I want to take advantage of that is not available in S-Plus). The only problem with this is, unfortunately, I cannot figure out how make the scale non-uniform and I hope to fix that. My data looks like this: IDDose Time Conc Pred ... 1 5 0 00 1 5 0.5 68 1 5 1 16 20 ... 1 7 0 00 1 7 0.5 10 12 1 7 1 20 19 ... 110 3 60 55 ... 2512 4 2 ... ect I don't care if it's ggplot or something else as long as it looks like how I envisioned. On Fri, Oct 15, 2010 at 12:22 AM, Dennis Murphy djmu...@gmail.com wrote: I don't recall that you submitted a reproducible example to use as a template for assistance. Ista was kind enough to offer a potential solution, but it was an abstraction based on the limited information provided in your previous mail. If you need help, please provide an example data set that illustrates the problems you're encountering and what you hope to achieve - your chances of a successful resolution will be much higher when you do. BTW, there's a dedicated newsgroup for ggplot2: look for the mailing list link at http://had.co.nz/ggplot2/ HTH, Dennis On Thu, Oct 14, 2010 at 10:02 PM, Anh Nguyen eataban...@gmail.com wrote: I found 2 problems with this method: - There is only one line for predicted dose at 5 mg. - The different doses are 5, 7, and 10 mg but somehow there is a legend for 5,6,7,8,9,10. - Is there a way to make the line smooth? - The plots are also getting a little crowded and I was wondering if there a way to split it into 2 or more pages? Thanks for your help. On Thu, Oct 14, 2010 at 8:09 PM, Ista Zahn iz...@psych.rochester.edu wrote: Hi, Assuming the data is in a data.frame named D, something like library(ggplot2) # May need install.packages(ggplot2) first ggplot(D, aes(x=Time, y=Concentration, color=Dose) + geom_point() + geom_line(aes(y = PredictedConcentration, group=1)) + facet_wrap(~ID, scales=free, ncol=3) should do it. -Ista On Thu, Oct 14, 2010 at 10:25 PM, thaliagoo eataban...@gmail.com wrote: Hello-- I have a data for small population who took 1 drug at 3 different doses. I have the actual drug concentrations as well as predicted concentrations by my model. This is what I'm looking for: - Time vs Concentration by ID (individual plots), with each subject occupying 1 plot -- there is to be 9 plots per page (3x3) - Observed drug concentration is made up of points, and predicted drug concentration is a curve without points. Points and curve will be the same color for each dose. Different doses will have different colors. - A legend to specify which color correlates to which dose. - Axes should be different for each individual (as some individual will have much higher drug concentration than others) and I want to see in detail how well predicted data fits observed data. Any help would be greatly appreciated. -- View this message in context: http://r.789695.n4.nabble.com/Time-vs-Concentration-Graphs-by-ID-tp2996431p2996431.html Sent from the R help mailing list archive at Nabble.com. __ 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. -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org [[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. attachment: ex.png__ 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.
Re: [R] Time vs Concentration Graphs by ID
On Oct 15, 2010, at 3:46 AM, Anh Nguyen wrote: Hello Dennis, That's a very good suggestion. I've attached a template here as a .png file, I hope you can view it. This is what I've managed to achieve in S- Plus (we use S-Plus at work but I also use R because there's some very good R packages for PK data that I want to take advantage of that is not available in S-Plus). The only problem with this is, unfortunately, I cannot figure out how make the scale non-uniform and I hope to fix that. That would be easy if your efforts which I have not yet seen were in lattice. If htat were the case then adding this would solve you problem: scales=list(y=list(relation=free) -- David My data looks like this: IDDose Time Conc Pred ... 1 5 0 00 1 5 0.5 68 1 5 1 16 20 ... 1 7 0 00 1 7 0.5 10 12 1 7 1 20 19 ... 110 3 60 55 ... 2512 4 2 ... ect I don't care if it's ggplot or something else as long as it looks like how I envisioned. On Fri, Oct 15, 2010 at 12:22 AM, Dennis Murphy djmu...@gmail.com wrote: I don't recall that you submitted a reproducible example to use as a template for assistance. Ista was kind enough to offer a potential solution, but it was an abstraction based on the limited information provided in your previous mail. If you need help, please provide an example data set that illustrates the problems you're encountering and what you hope to achieve - your chances of a successful resolution will be much higher when you do. BTW, there's a dedicated newsgroup for ggplot2: look for the mailing list link at http://had.co.nz/ggplot2/ HTH, Dennis On Thu, Oct 14, 2010 at 10:02 PM, Anh Nguyen eataban...@gmail.com wrote: I found 2 problems with this method: - There is only one line for predicted dose at 5 mg. - The different doses are 5, 7, and 10 mg but somehow there is a legend for 5,6,7,8,9,10. - Is there a way to make the line smooth? - The plots are also getting a little crowded and I was wondering if there a way to split it into 2 or more pages? Thanks for your help. On Thu, Oct 14, 2010 at 8:09 PM, Ista Zahn iz...@psych.rochester.edu wrote: Hi, Assuming the data is in a data.frame named D, something like library(ggplot2) # May need install.packages(ggplot2) first ggplot(D, aes(x=Time, y=Concentration, color=Dose) + geom_point() + geom_line(aes(y = PredictedConcentration, group=1)) + facet_wrap(~ID, scales=free, ncol=3) should do it. -Ista On Thu, Oct 14, 2010 at 10:25 PM, thaliagoo eataban...@gmail.com wrote: Hello-- I have a data for small population who took 1 drug at 3 different doses. I have the actual drug concentrations as well as predicted concentrations by my model. This is what I'm looking for: - Time vs Concentration by ID (individual plots), with each subject occupying 1 plot -- there is to be 9 plots per page (3x3) - Observed drug concentration is made up of points, and predicted drug concentration is a curve without points. Points and curve will be the same color for each dose. Different doses will have different colors. - A legend to specify which color correlates to which dose. - Axes should be different for each individual (as some individual will have much higher drug concentration than others) and I want to see in detail how well predicted data fits observed data. Any help would be greatly appreciated. -- View this message in context: http://r.789695.n4.nabble.com/Time-vs-Concentration-Graphs-by-ID-tp2996431p2996431.html Sent from the R help mailing list archive at Nabble.com. __ 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. -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org [[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. ex.png__ 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. David Winsemius, MD West
Re: [R] Time vs Concentration Graphs by ID
Hi: To get the plots precisely as you have given them in your png file, you're most likely going to have to use base graphics, especially if you want a separate legend in each panel. Packages ggplot2 and lattice have more structured ways of constructing such graphs, so you give up a bit of freedom in the details of plot construction to get nicer default configurations. Perhaps you've written a panel function in S-PLUS (?) to produce each graph in your png file - if so, you could simply add a couple of lines to determine the max y-value and from that the limits of the y scale. It shouldn't be at all difficult to make such modifications. Since R base graphics is very similar to base graphics in S-PLUS, you could possibly get away with popping your S-PLUS code directly into R and see how far that takes you. Lattice is based on Trellis graphics, but the syntax in lattice has changed a fair bit vis a vis Trellis as the package has developed. ggplot2 is a more recent graphics system in R predicated on the grammar of graphics exposited by Leland Wilkinson. For my example, I've modified the Theophylline data set in package nlme, described in Pinheiro Bates (2000), Mixed Effects Models in S and S-PLUS, Springer. The original data set has eleven unique doses - I combined them into three intervals and converted them to factor with cut(). I also created four groups of Subjects and put them into a variable ID. The output data frame is called theo. I didn't fit the nlme models to the subjects - instead, I was lazy and used loess smoothing instead. The code to generate the data frame is given below; this is what we mean by a 'reproducible example', something that can be copied and pasted into an R session. # Use modified version of Theophylline data in package nlme library(nlme) theo - Theoph theo - subset(theo, Dose 3.5) theo$dose - cut(theo$Dose, breaks = c(3, 4.5, 5, 6), labels = c('4.25', '4.8', '5.5')) theo - as.data.frame(theo) theo$ID - with(theo, ifelse(Subject %in% c(6, 7, 12), 1, ifelse(Subject %in% c(2, 8, 10), 2, ifelse(Subject %in% c(4, 11, 5), 3, 4) ))) # ID is used for faceting, dose for color and shape # lattice version: xyplot(conc ~ Time | factor(ID), data = theo, col.line = 1:3, pch = 1:3, col = 1:3, groups = dose, type = c('p', 'smooth'), scales = list(y = list(relation = 'free')), auto.key = list(corner = c(0.93, 0.4), lines = TRUE, points = TRUE, text = levels(theo$dose)) ) # ggplot2 version: # scales = 'free_y' allows independent y scales per panel g - ggplot(theo, aes(x = Time, y = conc, shape = dose, colour = dose, group = Subject)) g + geom_point() + geom_smooth(method = 'loess', se = FALSE) + facet_wrap( ~ ID, ncol = 2, scales = 'free_y') + opts(legend.position = c(0.9, 0.4)) This is meant to give you some indication how the two graphics systems work - it's a foundation, not an end product. There are a couple of ways I could have adjusted the y-scales in the lattice graphs (either directly in the scales = ... part or to use a prepanel function for loess), but since you're not likely to use loess in your plots, it's not an important consideration. Both ggplot2 and lattice place the legend outside the plot area by default; I've illustrated a couple of ways to pull it into the plot region FYI. One other thing: if your data set contains fitted values from your PK models for each subject * dose combination, the loess smoothing is unnecessary. In ggplot2, you would use geom_line(aes(y = pred), ...) in place of geom_smooth(), and in lattice you would replace 'smooth' by 'l' in the type = argument of xyplot(). HTH, Dennis On Fri, Oct 15, 2010 at 12:46 AM, Anh Nguyen eataban...@gmail.com wrote: Hello Dennis, That's a very good suggestion. I've attached a template here as a .png file, I hope you can view it. This is what I've managed to achieve in S-Plus (we use S-Plus at work but I also use R because there's some very good R packages for PK data that I want to take advantage of that is not available in S-Plus). The only problem with this is, unfortunately, I cannot figure out how make the scale non-uniform and I hope to fix that. My data looks like this: IDDose Time Conc Pred ... 1 5 0 00 1 5 0.5 68 1 5 1 16 20 ... 1 7 0 00 1 7 0.5 10 12 1 7 1 20 19 ... 110 3 60 55 ... 2512 4 2 ... ect I don't care if it's ggplot or something else as long as it looks like how I envisioned. On Fri, Oct 15, 2010 at 12:22 AM,
[R] Time vs Concentration Graphs by ID
Hello-- I have a data for small population who took 1 drug at 3 different doses. I have the actual drug concentrations as well as predicted concentrations by my model. This is what I'm looking for: - Time vs Concentration by ID (individual plots), with each subject occupying 1 plot -- there is to be 9 plots per page (3x3) - Observed drug concentration is made up of points, and predicted drug concentration is a curve without points. Points and curve will be the same color for each dose. Different doses will have different colors. - A legend to specify which color correlates to which dose. - Axes should be different for each individual (as some individual will have much higher drug concentration than others) and I want to see in detail how well predicted data fits observed data. Any help would be greatly appreciated. -- View this message in context: http://r.789695.n4.nabble.com/Time-vs-Concentration-Graphs-by-ID-tp2996431p2996431.html Sent from the R help mailing list archive at Nabble.com. __ 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.
Re: [R] Time vs Concentration Graphs by ID
Hi, Assuming the data is in a data.frame named D, something like library(ggplot2) # May need install.packages(ggplot2) first ggplot(D, aes(x=Time, y=Concentration, color=Dose) + geom_point() + geom_line(aes(y = PredictedConcentration, group=1)) + facet_wrap(~ID, scales=free, ncol=3) should do it. -Ista On Thu, Oct 14, 2010 at 10:25 PM, thaliagoo eataban...@gmail.com wrote: Hello-- I have a data for small population who took 1 drug at 3 different doses. I have the actual drug concentrations as well as predicted concentrations by my model. This is what I'm looking for: - Time vs Concentration by ID (individual plots), with each subject occupying 1 plot -- there is to be 9 plots per page (3x3) - Observed drug concentration is made up of points, and predicted drug concentration is a curve without points. Points and curve will be the same color for each dose. Different doses will have different colors. - A legend to specify which color correlates to which dose. - Axes should be different for each individual (as some individual will have much higher drug concentration than others) and I want to see in detail how well predicted data fits observed data. Any help would be greatly appreciated. -- View this message in context: http://r.789695.n4.nabble.com/Time-vs-Concentration-Graphs-by-ID-tp2996431p2996431.html Sent from the R help mailing list archive at Nabble.com. __ 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. -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org __ 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.