[R] multiple plots using a loop

ONKELINX, Thierry Thierry.ONKELINX at inbo.be
Mon Feb 21 13:16:49 CET 2011


It is also a one-liner with ggplot2

dataset <- data.frame(Factor = rep(factor(letters[1:4]), each = 10),
    Size = runif(40) * 100)
library(ggplot2)
ggplot(dataset, aes(x = Size)) + geom_histogram() + facet_wrap(~Factor)


----------------------------------------------------------------------------
ir. Thierry Onkelinx
Instituut voor natuur- en bosonderzoek
team Biometrie & Kwaliteitszorg
Gaverstraat 4
9500 Geraardsbergen
Belgium

Research Institute for Nature and Forest
team Biometrics & Quality Assurance
Gaverstraat 4
9500 Geraardsbergen
Belgium

tel. + 32 54/436 185
Thierry.Onkelinx op inbo.be
www.inbo.be

To call in the statistician after the experiment is done may be no more than asking him to perform a post-mortem examination: he may be able to say what the experiment died of.
~ Sir Ronald Aylmer Fisher

The plural of anecdote is not data.
~ Roger Brinner

The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data.
~ John Tukey
  

> -----Oorspronkelijk bericht-----
> Van: r-help-bounces op r-project.org 
> [mailto:r-help-bounces op r-project.org] Namens Dennis Murphy
> Verzonden: maandag 21 februari 2011 12:45
> Aan: Darcy Webber
> CC: r-help op r-project.org
> Onderwerp: Re: [R] multiple plots using a loop
> 
> Hi:
> 
> Here's one way with the plyr package and function d_ply(); 
> the hist() function itself is not very elegant, but it 
> 'works' for this example.
> 
> Factor <- rep(factor(letters[1:4]), each = 10) Size <- runif(40) * 100
> library(plyr)
> par(mfrow = c(2, 2))
> d <- data.frame(Factor, Size)
> # Function to produce a histogram for a generic (subset of a) 
> data frame f <- function(df) {
>       hist(df$Size, main = df$Factor[1],
>                        xlab = paste('n =', nrow(df)), ylab = '')
>     }
> d_ply(d, 'Factor', f)
> 
> d2 <- data.frame(Factor = rep(LETTERS[1:4], c(10, 20, 30, 40)),
>                  Size = runif(100, 0, 100)) d_ply(d2, 'Factor', f)
> 
> # Another way, using a loop with data frame d2 above:
> 
> par(mfrow = c(2, 2))
> for(i in seq_along(levels(d2$Factor))) {
>   val <- levels(d2$Factor)[i]
>   df <- subset(d2, Factor == val)
>   hist(unlist(df['Size']), main = val,
>         xlab = paste('n =', nrow(df)), ylab = '')
>   }
> par(mfrow = c(1, 1))
> 
> The advantage of the plyr method is that you can change the 
> data frame, and as long as it has the same variable names 
> with the same classes, it should work.
> 
> Except for the sample sizes as x-axis labels, this could be 
> easily done in lattice in one line:
> 
> library(lattice)
> histogram(~ Size | Factor)    # if using the original vectors
> histogram(~ Size | Factor, data = d2)   # if using a data 
> frame instead
> # change the panel ordering and use counts instead of 
> percents histogram(~ Size | Factor, data = d2, as.table = 
> TRUE, type = 'count')
> 
> I'll give someone else the opportunity to show how to get the 
> sample sizes as x-labels in each panel; I'm not that good at 
> writing panel functions in lattice.
> 
> HTH,
> Dennis
> 
> 
> On Mon, Feb 21, 2011 at 1:25 AM, Darcy Webber 
> <darcy.webber op gmail.com>wrote:
> 
> > Dear R users,
> >
> > I am trying to write myself a loop in order to produce a set of 20 
> > length frequency plots each pertaining to a factor level. I 
> would like 
> > each of these plots to be available on the same figure, so 
> I have used 
> > par(mfrow = c(4, 5)). However, when I run my loop below, it 
> produces 
> > 20 plots for each factor level and only displays the last factor 
> > levels LF plots. I'm fairly new to loops in R, so any help would be 
> > greatly appreciated.
> >
> > I have provided an example data set below if required with just 4 
> > factors and adjusted par settings accordingly.
> >
> > Factor <- rep(factor(letters[1:4]), each = 10) Size <- 
> runif(40) * 100
> >
> > par(mfrow = c(2, 2))
> >
> > for (i in Factor) {
> > LFchart <- hist(Size[Factor == i], main = i, xlab = c("n 
> > =",length(Size[Factor == i])), ylab = "") }
> >
> > P.S. Also just a quick annoying question. My xlab displays:
> > n =
> > 120
> > I would like it to display:
> > n = 120
> > but just cant get it to work. Any thoughts.
> >
> > Regar
> >
> > ______________________________________________
> > R-help op 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 op 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.
> 


More information about the R-help mailing list