Okay. If you get stuck, you can always roll your own:

psdf<-read.table("sim_data.txt",header=TRUE,stringsAsFactors=FALSE)
library(plotrix)
source("supsubtext.R")
par(cex.axis=1.5)
for(i in 3:6) {
 png(paste0("TestAge_",names(psdf[i]),".png"),width=600)
 plot(psdf$Age,psdf[,i],xlim=c(20,85),ylim=c(-0.1,0.5),
  xlab="Age",ylab=names(psdf)[i],
  axes=FALSE,pch=19,col=c("green","orange")[psdf$AgeGroup+1],
  cex=2)
 fullaxis(1,col="black",lwd=1.5)
 fullaxis(2,col="black",lwd=1.5)
 # fit the entire column
 lmfit<-lm(psdf[,i]~psdf$Age)
 lmpf<-predict(lmfit,se.fit=TRUE)
 uniqage<-sort(unique(psdf$Age))
 cis<-supsmu(psdf$Age,lmpf$se.fit)$y
 lmline<-lmfit$coefficients[1]+uniqage*lmfit$coefficients[2]
 # display the overall confidence band
 polygon(c(uniqage,rev(uniqage)),c(lmline+cis,rev(lmline-cis)),
  border=NA,col="lightgray")
 # now the "young" group
 young<-psdf$AgeGroup == 0
 lmfit<-lm(psdf[young,i]~psdf[young,"Age"])
 lmpf<-predict(lmfit,se.fit=TRUE)
 uniqage<-sort(unique(psdf$Age[young]))
 cis<-supsmu(psdf$Age[young],lmpf$se.fit)$y
 lmline<-lmfit$coefficients[1]+uniqage*lmfit$coefficients[2]
 polygon(c(uniqage,rev(uniqage)),c(lmline+cis,rev(lmline-cis)),
  border=NA,col="#88ff8880")
 # now the "old" group
 old<-psdf$AgeGroup == 1
 lmfit<-lm(psdf[old,i]~psdf[old,"Age"])
 lmpf<-predict(lmfit,se.fit=TRUE)
 uniqage<-sort(unique(psdf$Age[old]))
 cis<-supsmu(psdf$Age[old],lmpf$se.fit)$y
 lmline<-lmfit$coefficients[1]+uniqage*lmfit$coefficients[2]
 polygon(c(uniqage,rev(uniqage)),c(lmline+cis,rev(lmline-cis)),
  border=NA,col="#ffaa8880")
 points(psdf$Age,psdf[,i],pch=19,
  col=c("green","orange")[psdf$AgeGroup+1],cex=2)
 # overall correlation
 corval<-cor.test(psdf$Age,psdf[,i])
 corstr<-paste0("R(overall) = ",round(corval$estimate,2),", p = ",
  round(corval$p.value,2))
 supsubtext(20,0.05,corstr,sub=2:10,col="blue")
 # young correlation
 corval<-cor.test(psdf[young,"Age"],psdf[young,i])
 corstr<-paste0("R(young) = ",round(corval$estimate,2),", p = ",
  round(corval$p.value,2))
 supsubtext(20,0,corstr,sub=2:8,col="green")
 # old correlation
 corval<-cor.test(psdf[old,"Age"],psdf[old,i])
 corstr<-paste0("R(old) = ",round(corval$estimate,2),", p = ",
  round(corval$p.value,2))
 supsubtext(20,-0.05,corstr,sub=2:6,col="orange")
 legend(40,0.5,c("Overall","Young","Old"),pch=19,
  col=c("lightgray","green","orange"))
 dev.off()
}

I've been meaning to finish off the "supsubtext" function for a while.

Jim

On Sun, Jul 12, 2020 at 11:20 AM Paulina Skolasinska
<paulina.s...@hotmail.com> wrote:
>
> Sorry for misspelling your name, Jim. Well, it seems this is not worth the 
> effort then. If my advisor decides this is absolutely essential, I’ll add it 
> in gimp or something. Thanks for giving it a go, Jim.
>
> Get Outlook for iOS
> ________________________________
> From: Jim Lemon <drjimle...@gmail.com>
> Sent: Saturday, July 11, 2020 6:32:13 PM
> To: Paulina Skolasinska <paulina.s...@hotmail.com>
> Cc: r-help@r-project.org <r-help@r-project.org>
> Subject: Re: [R] How to differ stats_cor labels by group on a ggplot
>
> Hi Paulina,
> Thanks for the data. Even after downloading a ton of packages along
> with the "ggpubr" package, I get a namespace error when I try to load
> it. After a bit of wrangling, I did get the code to run without the
> "stat_cor" function, producing the four PNG images. My best guess is
> to try the geom_label function with stat="cor", but I can't see any
> argument to format the actual label. I think this is about as far as
> I'm going to get.
>
> Jim
>
> On Sun, Jul 12, 2020 at 12:09 AM Paulina Skolasinska
> <paulina.s...@hotmail.com> wrote:
> >
> > Thanks Tim, here is the link to the data: https://we.tl/t-c4x9Lw7LeR
> > I'm posting my code again so it better matches the modified data, and 
> > because I've added several improvements in the meantime.
> >
> > for (i in 3:6) {
> >     p1 <- ggplot(df, mapping=aes(x = Age, y = unlist(df[i]), 
> > color=factor(AgeGroup))) +
> >         geom_smooth(method="lm") +
> >         geom_point(size = 4) +
> >         scale_x_continuous(breaks = seq(20,90, by=10)) +
> >         scale_y_continuous(breaks = seq(0.1,0.5, by=0.1)) +
> >         theme_classic() +
> >         expand_limits(y = 0.5) +
> >         ylab(names(df)[i]) +
> >         theme(axis.text.x = element_text(face="bold", size=14),
> >               axis.text.y = element_text(face="bold", size=14),
> >               axis.title.x = element_text(size=14, face="bold"),
> >               axis.title.y = element_text(size=14, face="bold"),
> >               legend.title = element_text(color="black", size=12),
> >               legend.text = element_text(colour="black", size = 14, face = 
> > "bold")) +
> >         geom_smooth(data=df, mapping = aes(x = Age, y = unlist(df[i]), 
> > group=1, color="black"), method = "lm") +
> >         scale_colour_discrete(name="Group", labels=c("Young", "Old", 
> > "Overall")) +
> >         stat_cor(aes(color = factor(AgeGroup), y = unlist(df[i])),
> >                  method = "pearson", label.x.npc = c("center"), 
> > label.y.npc="top") +
> >         stat_cor(aes(x = Age, y = unlist(df[i]),
> >                  label = 
> > paste(sub("R",expression("R"[overall]),..r.label..), ..p.label.., sep = 
> > "~`,`~"),
> >                  group=1, color="black"), method = "pearson",label.y=0.5, 
> > label.x.npc = c("center"),
> >                  position = position_nudge(y = 0.015 * 0.5))
> >
> >     ggsave(p1, file=paste0("TestAge_", names(df)[i], ".png"), scale=1, 
> > width=16, height=10, units="cm")
> > }
> >
> >
> > ________________________________
> > Od: Jim Lemon <drjimle...@gmail.com>
> > Wysłane: sobota, 11 lipca 2020 04:09
> > Do: Paulina Skolasinska <paulina.s...@hotmail.com>
> > DW: r-help@r-project.org <r-help@r-project.org>
> > Temat: Re: [R] How to differ stats_cor labels by group on a ggplot
> >
> > Hi Paulina,
> > Without data it's hard to work out what you are doing. Even a small
> > simulated data set would help to get answers.
> >
> > Jim
> >
> > On Fri, Jul 10, 2020 at 11:49 PM Paulina Skolasinska
> > <paulina.s...@hotmail.com> wrote:
> > >
> > > 'm using ggplot2 to plot two variables at a time. I'm plotting two age 
> > > groups and overall data on the same graph. I'm also using stat_cor form 
> > > the ggpubr package to report correlations for the two groups and overall 
> > > data.
> > >
> > > I want each stat_cor label to have a custom subscript - the group name 
> > > ("old", "young"). I have managed to do this for the overall data, but I 
> > > don't know how to add custom labels for each group separately. I'd like 
> > > the labels to look like this: https://imgur.com/a/naF7uNW
> > >
> > > > for (i in 18:21) {
> > >   p1 <- ggplot(df, mapping=aes(x = Age, y = unlist(df[i]), 
> > > color=factor(AgeGroup))) +
> > >     geom_smooth(method="lm") +
> > >     geom_point(size = 4) +
> > >     geom_smooth(data=df, mapping = aes(x = Age, y = unlist(df[i]), 
> > > group=1, color="black"), method = "lm") +
> > >     scale_colour_discrete(name="Group", labels=c("young", "old", 
> > > "overall")) +
> > >     stat_cor(aes(color = factor(AgeGroup), y = unlist(df[i]))) +
> > >     stat_cor(aes(x = Age, y = unlist(df[i]), group=1, color="black",
> > >                  label = 
> > > paste(sub("R",expression("R"[overall]),..r.label..), ..p.label.., sep = 
> > > "~`,`~")))
> > >
> > >   ggsave(p1, file=paste0("Age_", names(df)[i], ".png"), scale=1)
> > > }
> > > ______________________________________________
> > > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > > https://stat.ethz.ch/mailman/listinfo/r-help
> > > PLEASE do read the posting guide 
> > > http://www.R-project.org/posting-guide.html
> > > and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to