[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