Estoy intentando armar un diagrama de caja multipanel con ggplot. Para tener una estructura general, estoy generando una lista de parcelas y trazándolas. También quiero agregar letras que informen grupos de importancia para cada diagrama de caja. Todo funciona bien, excepto por el hecho de que todos los diagramas de caja muestran las letras calculadas durante la última iteración del ciclo.

A continuación publico un ejemplo en el que solo trato de agregar letras que informan el número de iteración del bucle y, como puede ver, en lugar de informar "Plot 1" para el primer bucle y "Plot 2" para el segundo, siempre traza el segundo.

Plot with wrong letters

El código que utilicé es el siguiente:

library(ggplot2)
library(gridExtra)
mydata<-data.frame(values=c(1,4,5,6,4,2,4,7,3,4,5,6,4,4,2,1,3,6,4,1,2,5,4,3,4,2,1,3,4,2),group=c(rep("A",15),rep("B",15)))
mydata2<-data.frame(values=c(2,6,5,6,7,2,5,7,3,4,5,6,4,4,2,1,3,6,4,1,2,5,4,3,1,2,3,3,4,7),group=c(rep("A",15),rep("B",15)))
myp<-list()
for(aaa in 1:2)
{
if(aaa==1) mydata<-mydata else mydata<-mydata2
myp[[aaa]]<-ggplot(mydata, aes(x=group, y=values)) +
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(position=position_jitter(width=.1, height=0)) +
  geom_text(aes(x=1, y=max(values)-0.05*max(values),label=paste("Plot",aaa))) +
  geom_text(aes(x=2, y=max(values)-0.05*max(values),label=paste("Plot",aaa)))
}
do.call(grid.arrange,myp)

¿Qué estoy haciendo mal? Parece que el uso de do.call con grid.arrange crea problemas con geom_text (pero no con la trama, que es diferente en los dos bucles). Preferiría NO escribir manualmente todas las funciones de la gráfica, ya que tengo al menos tres gráficas multipanel cada una con 4 gráficas de caja.

0
Fabio Marroni 14 oct. 2019 a las 16:15

1 respuesta

La mejor respuesta

No estoy completamente seguro de qué sale mal con geom_text, pero todo funciona si usa annotate en su lugar (que debería usarse exactamente para este propósito).

for(aaa in 1:2){
  print(aaa)
  if(aaa==1) df<-mydata else df<-mydata2
  myp[[aaa]]<-ggplot(df, aes(x=group, y=values)) +
    geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
    geom_jitter(position=position_jitter(width=.1, height=0)) +
    annotate("text", x=1, y=max(df$values)-0.05*max(df$values),label=paste("Plot",aaa)) +
    annotate("text", x=2, y=max(df$values)-0.05*max(df$values),label=paste("Plot",aaa))
}

example

1
Arienrhod 14 oct. 2019 a las 14:01