Search code examples
rggplot2annotationsexpressionggtext

Using ggplot geom_text when combining superscript and variable label that contains < symbol


I am having trouble adding R2 annotations to a faceted plot, where my R2 values are sometimes <0.01 (yes, it's not a good regression). I would like the 2 of R2 to be superscript. I have tried several options but seem to be stymied by the < symbol in my values

eg, using the iris data set, I first set up a new data frame with my R2 values previously calculated. The x & y positions are also set up as these are different for every facet (not essential for the iris dataset, but it is for mine)

SEr2s <- data.frame(Species = c("virginica",  "setosa",  "versicolor" ), 
                  xpos = c(5,7,7), ypos = c(4.2, 2, 4.2), 
                  lab = c("<0.01","0.08", "0.05"))

Then I run my plot:

XYPlot<-ggplot(data = iris, aes(x=Sepal.Length)) + 
  geom_point(aes(y = Sepal.Width), colour="grey40")+
  geom_smooth(aes(y = Sepal.Width), col="grey40", lwd=0.5, method="lm", se=FALSE) +
  geom_text(data = SEr2s, size=3, vjust=0, hjust=0,
            aes(x = xpos,  y = ypos, 
             label = paste("r^2==",lab)), parse = TRUE)+
  theme_bw() +
  theme(strip.background = element_blank(), strip.placement = "outside",
        panel.grid.minor = element_blank(), legend.position = "right") +
  facet_wrap(~Species)

I get this error:

Error in parse(text = text[[i]]) : :1:7: unexpected '<' 1: r^2== < ^

Is there a way to change my code or my labelling dataframe so that it doesn't try to evaluate these symbols?


Solution

  • I think that the easier solution is to define the subscript in your data.frame (SEr2s):

    SEr2s <- data.frame(Species = c("virginica",  "setosa",  "versicolor" ), 
                        xpos = c(5,7,7), ypos = c(4.2, 2, 4.2), 
                        lab = c("atop(R^2<0.01)","atop(R^2==0.08)", "atop(R^2==0.05)"))
    

    Then, you can call ggplot without just with label=lab:

    
    ggplot(data = iris, aes(x=Sepal.Length)) + 
        geom_point(aes(y = Sepal.Width), colour="grey40")+
        geom_smooth(aes(y = Sepal.Width), col="grey40", lwd=0.5, method="lm", se=FALSE) +
        geom_text(data = SEr2s, size=3, vjust=0, hjust=0,
                  aes(x = xpos,  y = ypos, 
                      label = lab), parse = TRUE)+
        theme_bw() +
        theme(strip.background = element_blank(), strip.placement = "outside",
              panel.grid.minor = element_blank(), legend.position = "right") +
        facet_wrap(~Species)
    

    I think this gives you the plot you want: plot_R2 https://ibb.co/vwbvqp2