web-dev-qa-db-fra.com

ggplot renommer les étiquettes de facettes dans facet_wrap

J'ai rencontré une pierre d'achoppement en écrivant une fonction ggplot. J'essaie de changer les étiquettes de facettes dans un tracé ggplot facet_wrap .... mais c'est plus compliqué que je ne le pensais ...

Les données que j'utilise sont accessibles ici

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 ...

J'ai écrit la fonction suivante pour créer le ggplot qui utilise les niveaux de facteur isotopique pour étiqueter les facettes:

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)}

Résultat dans ce joli graphique:

enter image description here

Ce qui est bien, mais je veux changer les étiquettes des facettes maintenant ... Après avoir fouillé google, j'ai pensé que je pourrais être en mesure d'utiliser la fonction labeller comme argument pour passer à facet_wrap. Après une heure frustrante, j'ai découvert que cela ne fonctionne qu'avec facet_grid !!! ??? Donc, une autre méthode était de changer les noms des niveaux de facteurs, alors donnez-moi les étiquettes de facettes que je veux:

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

Cela fonctionne, mais le problème que j'ai maintenant, c'est que je veux que les numéros dans les étiquettes soient super-scriptés. Quelqu'un peut-il suggérer la meilleure façon d'y parvenir? Merci

13
Rory Shaw

Parvenez à le trier! A eu du mal à installer la version de développement de ggplot mais après avoir installé curl et devtools et réinstallé scalesil a fonctionné. J'ai essayé la réponse @ eipi10 mais je n'ai pas réussi à le faire fonctionner, j'ai donc changé les noms d'étiquette de facteur d'une manière différente:

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"))

J'ai ensuite ajusté la fonction ggplot pour passer labeller = label_parsed à la facet_wrap fonction:

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)}

Passer le ggdata au plot_func me donne les graphiques ci-dessous avec les étiquettes de facettes correctes.

enter image description here

2
Rory Shaw

Définissez les étiquettes de facette sur les expressions appropriées, puis utilisez la fonction labellerlabel_parsed pour vous assurer qu'ils s'affichent correctement. Voici un exemple, en utilisant le cadre de données iris intégré:

data(iris)
iris$Species = as.character(iris$Species)
iris$Species[iris$Species == "virginica"] = "NULL^14*C~Amino~Acids"

ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
  geom_point() +
  facet_wrap(~ Species, labeller=label_parsed)

Vous devez ajouter le NULL avant ^14*C ou vous obtiendrez une erreur en raison d'avoir ^ comme caractère initial. * et ~ marque les limites de chaque partie de l'expression, selon que vous ne voulez pas ou voulez un espace entre chaque partie.

Au moment de la rédaction de ce document (12 décembre 2015), vous devez utiliser la version de développement de ggplot2 pour que cela fonctionne avec facet_wrap. Cependant, cette fonctionnalité sera vraisemblablement bientôt incorporée dans une version régulière du package.

enter image description here

12
eipi10