[R] geom_text only in the first panel with facet_wrap in ggplot2
Maria Lathouri
ml@thouri @ending from y@hoo@gr
Mon Jun 25 09:50:53 CEST 2018
Dear all,
I am trying to add text only in the first panel of a faceted ggplot; I have been struggling to find a solution on this online but unfortunately none of what I found is working.
Here it is a reproducible example. I hope it helps:
library(gamm4)
library(ggplot2)
example<-read.csv("example.csv")
head(example)
# Q index ASB Year WB_ID S_ID score_1 score_2 works
#1 100 1.02 1 2011 CL102021072830 157166 0 2.83 0
#2 100 1.03 1 2014 CL102021072830 157166 0 2.83 0
#3 80 1.02 1 2013 CL102021072860 1636 0 10.39 0
#4 80 1.06 2 2006 CL102021072860 1636 0 10.39 0
#5 80 1.06 2 2003 CL102021072860 1636 0 10.39 0
#6 98 1.07 3 2002 CL102021072900 1635 0 7.57 0
str(example)
#'data.frame': 249 obs. of 9 variables:
# $ Q : int 100 100 80 80 80 98 105 105 105 105 ...
#$ index : num 1.02 1.03 1.02 1.06 1.06 1.07 1.14 1.05 1.1 1.08 ...
#$ ASB : int 1 1 1 2 2 3 1 1 3 3 ...
#$ Year : int 2011 2014 2013 2006 2003 2002 2013 2005 2013 2006 ...
#$ WB_ID : Factor w/ 44 levels "CL102021072830",..: 1 1 2 2 2 3 3 3 4 4 ...
#$ S_ID : int 157166 157166 1636 1636 1636 1635 1635 1635 134261 1631 ...
#$ score_1: int 0 0 0 0 0 0 0 0 0 0 ...
#$ score_2: num 2.83 2.83 10.39 10.39 10.39 ...
#$ works : num 0 0 0 0 0 0 0 0 0 0 ...
# I need first to run a mixed-effect model
model<-gamm4(index~s(Q, by=factor(ASB))+Year+score_1+score_2+works, data=example, random=~(1|WB_ID/S_ID))
#I had to create a new dataset so I can use this with the ggplot2
newDat <- expand.grid(ASB = factor(example$ASB),
Q = seq(from = min(example$Q, na.rm = TRUE),
to = max(example$Q, na.rm = TRUE),
length = 100),
Year = 2002,
score_1 = mean(example$score_1),
score_2 = mean(example$score_2),
works = mean(example$works),
WB_ID = "CL102021072830",
S_ID = "157166")
datM <- predict(model$gam, type = "response",
se.fit = TRUE, newdata = newDat)
newDat$fit <- datM$fit
newDat$upr <- datM$fit + (1.96 * datM$se.fit)
newDat$lwr <- datM$fit - (1.96 * datM$se.fit)
#I create a new variable for ASB so I can change the panel text
newDat$asb_1<-factor(newDat$ASB, levels=c(1, 2, 3), labels=c("ASB1", "ASB2", "ASB3"))
#I plot this with ggplot2
p<-ggplot(newDat, aes(x = Q, y = fit, group = ASB)) +
theme_bw() +
geom_rug(data = example, aes(x = Q, y = 0.96), sides = "b") +
ylim(0.96, 1.04) +
geom_ribbon(aes(ymin = lwr, ymax = upr), col = NA, fill = "grey",
alpha = 0.3) +
geom_line(size = 1) +
facet_wrap(~ asb_1, labeller = label_parsed)
#When I try to add the text through geom_text, I get the text to all the three panels
dat_text <- data.frame(label = c("Text", " ", " "), ASB = c(1, 2, 3))
p + geom_text(x=20, y=1.03, data = dat_text, label = label)
# or
p+geom_text(x=20, y=1.03 , aes(label=label), data=dat_text)
# I tried another way
ann_text <- data.frame(Q = 20, fit = 1.03, lab = "Text", ASB = factor(1,levels = c("1","2","3")))
p + geom_text(data = ann_text, label = "Text")
# When I tried to use asb_1 instead of ASB, I got an errorann_text <- data.frame(Q = 20, fit = 1.03, lab = "Text", asb = factor("ASB1",levels = c("1","2","3")))
#Error in FUN(X[[i]], ...) : object 'ASB' not found
I would very much appreciate for your help.
Thank you very much in advance.
Kind regards,
Maria
More information about the R-help
mailing list