问题
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?
回答1:
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: https://ibb.co/vwbvqp2
回答2:
You can avoid plotmath if you're using the ggtext package instead, which can handle basic HTML/markdown as input.
library(ggplot2)
library(ggtext)
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"))
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_richtext(
data = SEr2s, size=3, vjust=0, hjust=0,
aes(x = xpos, y = ypos, label = paste0("r<sup>2</sup> = ", lab))
) +
theme_bw() +
theme(
strip.background = element_blank(), strip.placement = "outside",
panel.grid.minor = element_blank(), legend.position = "right") +
facet_wrap(~Species)
#> `geom_smooth()` using formula 'y ~ x'
Created on 2019-12-02 by the reprex package (v0.3.0)
来源:https://stackoverflow.com/questions/59129952/using-ggplot-geom-text-when-combining-superscript-and-variable-label-that-contai