Search code examples
rggplot2facet-wrap

ggplot renaming facet labels in facet_wrap


I've hit a stumbling block in writing a ggplot function. I'm trying to change the facet labels in a ggplot facet_wrap plot.... but its proving trickier than I though it would be....

The data I am using can be accessed here

str(ggdata)
'data.frame':   72 obs. of  8 variables:
 $ Season : Factor w/ 3 levels "Autumn","Spring",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ Site   : Factor w/ 27 levels "Afon Cadnant",..: 13 13 13 13 13 13 13 13 13 13 ...
 $ Isotope: Factor w/ 4 levels "14CAA","14CGlu",..: 1 1 1 1 1 1 2 2 2 2 ...
 $ Time   : int  0 2 5 24 48 72 0 2 5 24 ...
 $ n      : int  3 3 3 3 3 3 3 3 3 3 ...
 $ mean   : num  100 88.4 80.7 40.5 27.6 ...
 $ sd     : num  0 1.74 2.85 2.58 2.55 ...
 $ se     : num  0 1 1.65 1.49 1.47 ...

I have written the following function to create the ggplot which uses the Isotope factor levels to label the facets:

plot_func <- function(T) {site_plots <- ggplot(data = T) + geom_point(aes(Time, mean, colour = Season, shape = Season)) + 
  geom_line(aes(Time, mean, colour = Season, linetype = Season)) +
  geom_errorbar(aes(Time, mean, ymax = (mean + se), ymin = (mean - se)), width = 2) +
  labs(title = T$Site[1], y = "Percentage of isotope remaining in solution", x = "Time (h)") +
  scale_x_continuous(breaks=c(0, 24, 48, 72)) +
  scale_y_continuous(limits=c(0,115), breaks = c(0,25,50,75,100)) +  
  theme(axis.title.y = element_text(vjust = 5)) +
  theme(axis.title.x = element_text(vjust = -5)) + theme(plot.title =  element_text(vjust = -10)) +
  theme_bw() + facet_wrap(~Isotope, ncol =2) 
  print(site_plots)
  ggsave(plot = site_plots, filename = paste(T$Site[1], ".pdf"), 
     path = "C:/Users/afs61d/Dropbox/Academic/R/Practice datasets/Helens_data/Site_Isotope_Season_plots/", 
     width = 9, height = 7, dpi = 300)}

Resulting in this lovely graph:

enter image description here

Which is nice but I want to change the facet labels now... Having done some poking around google I thought I might be able to use the labeller function as an argument to pass to facet_wrap. After a frustrating hour I discovered that this only works with facet_grid!!!??? So, an alternative method was to change the Factor level names so give me the facet labels that I want::

 gdata$Isotope <- revalue(x = ggdata$Isotope, 
c("14CAA" = " 14C Amino Acids", "14CGlu" = "14C Glucose", 
  "14cGlu6P" = "14C Glucose-6-phosphate", "33P" = "33P Phosphate"))

This works, but the problem I have now is that I want the numbers in the labels to be super-scripted. Can anyone suggest the best way to achieve this? Thanks


Solution

  • Manage to sort it out! Had trouble installing the development version of ggplot but after installing curl and devtools and reinstalling scalesit worked. I tried @eipi10 answer but couldn't get that to work so I changed the factor label names in a different way:

    ggdata$Isotope <- factor(ggdata$Isotope, labels = c("NULL^14*C~Amino~Acids", 
    "NULL^14*C~Glucose", "NULL^14*C~Glucose-6-phosphate", "NULL^33*P~Phosphate"))
    

    I then adjusted the ggplot function to pass labeller = label_parsed to the facet_wrap function:

    plot_func <- function(T) {site_plots <- ggplot(data = T) + geom_point(aes(Time, mean, colour = Season, shape = Season)) + 
      geom_line(aes(Time, mean, colour = Season, linetype = Season)) +
      geom_errorbar(aes(Time, mean, ymax = (mean + se), ymin = (mean - se)), width = 2) +
      labs(title = T$Site[1], y = "Percentage of isotope remaining in solution", x = "Time (h)") +
      scale_x_continuous(breaks=c(0, 24, 48, 72)) +
      scale_y_continuous(limits=c(0,115), breaks = c(0,25,50,75,100)) +  
      theme(axis.title.y = element_text(vjust = 5)) +
      theme(axis.title.x = element_text(vjust = -5)) + theme(plot.title = element_text(vjust = -10)) +
      theme_bw() + facet_wrap(~Isotope, ncol =2, labeller = label_parsed) 
      print(site_plots)
      ggsave(plot = site_plots, filename = paste(T$Site[1], ".pdf"), 
         path = "C:/Users/afs61d/Dropbox/Academic/R/Practice datasets/Helens_data/Site_Isotope_Season_plots/", 
         width = 9, height = 7, dpi = 300)}
    

    Passing the ggdata to the plot_func gives me the below graphs with the correct facet labels.

    enter image description here