2

I have a large dataset that I would prefer not to split up because it will be rather time consuming. One column contains a list of parks which I want to make separate plots for as each plot belongs somewhere different. Each park needs to be grouped by Zone and Year as time series graphs. The mean for Height_mm also needs to be calculated with standard errors. There are 5 different parks each with 3 different zones and 10 different years. There are over 5000 records in the csv.

head(data)

  Park_name  Zone Year  Height_mm
1     Park1 Zone1 2011        380
2     Park1 Zone1 2011        510
3     Park1 Zone1 2011        270
4     Park1 Zone2 2011        270
5     Park1 Zone2 2011        230
6     Park1 Zone2 2011        330

I would like to be able to manipulate the code below to make this work though I just can't figure it out. I'll gladly take any other suggestions though.

library(ggplot2)
library(plyr)

data=read.table("C:/data.csv", sep=",", header=TRUE)

ggplot(data, aes(x=Year, y=Height_mm)) + 
  #geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.05, colour="black", position=pd) +
  geom_line() +
  geom_point(size=3, fill="black") +
  xlab("Year") + 
  ylab("Mean height (mm)") +
  #facet_wrap(~Park_name, scales = "free", ncol=2) + #I'd like something like this but with all plots as separate figures
  theme_bw() +
  theme(axis.text.x=theme_text(),  
        #axis.title.x=theme_blank(), 
        #axis.title.y=theme_blank(), 
        axis.line=theme_segment(colour="black"), 
        panel.grid.minor = theme_blank(),
        panel.grid.major = theme_blank(),
        panel.border=theme_blank(),
        panel.background=theme_blank(),
        legend.justification=c(10,10), legend.position=c(10,10), 
        legend.title = theme_text(),
        legend.key = theme_blank()
  )

I'm assuming I need a 'for' loop of some kind though I don't know where to put it or how to use it. Thanks

3
  • Have you considered aggregate, split, by or tapply to chop up data? Commented Jul 26, 2013 at 5:56
  • 5000 records is now considered a small dataset, and would take no appreciable time to split Commented Jul 26, 2013 at 12:08
  • if I call p your original plot, you can do d_ply(Y, "Park_name", "%+%", e1=p). Commented Jul 26, 2013 at 12:12

1 Answer 1

1

It seems that you would like to do something similar to the following. If I missunderstood your question, please revise your question. You may also want to provide data from more than one park, zone and year.

# load packages
require(ggplot2)
require(plyr)
# read data 
Y <- read.table("C:/data.csv", sep=",", header=TRUE)
# define the theme
th <- theme_bw() +
  theme(axis.text.x=element_text(),  
        axis.line=element_line(colour="black"), 
        panel.grid.minor = element_blank(),
        panel.grid.major = element_blank(),
        panel.background=element_blank(),
        legend.justification=c(10,10), legend.position=c(10,10), 
        legend.title = element_text(),
        legend.key = element_blank()
        )
# determine park levels
parks <- levels(Y[,"Park_name"])
# apply seperately for each park
p <- lapply(parks, function(park) {
ggplot(Y[Y[, "Park_name"]==park,], aes(x=as.factor(Year), y=Height_mm)) +
  facet_grid(Zone~.) + # show each zone in a seperate facet
  geom_point() + # plot the actual heights (if desired)
  # plot the mean and confidence interval
  stat_summary(fun.data="mean_cl_boot", color="red") 
})       
# finally print your plots
lapply(p, function(x) print(x+th))
Sign up to request clarification or add additional context in comments.

2 Comments

Perfect! Just what I was looking for. Just a little bit of personalisation left and it's all good! Thank you so much!!
I've modified this code so that it builds out graphs that fit my data, and would like to print each one to a separate page in 1 PDF file. I've tried: pdf("filename",onefile=TRUE) lapply(p, function(x) print(x+th)) dev.off() But I get a single page, blank PDF. Any idea what I am missing?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.