Skip to content
Prev 384739 / 398502 Next

How to differ stats_cor labels by group on a ggplot

Hello,

The code below puts the group names as subscripts to 'R'.
The trick is to create each of the labels with those names before 
pasting the ..p.label..
This is done by Map, calling a function f defined outside the for loop.

I have also changed your code a bit, simplifying parts of it.

1. I have named the data set df1, since df already is a base R function.
2. Instead of redefining theme() elements in the loop, I have created a 
custom one.
3. The for loop runs directly through the names of the data set df1, not 
through indices into them.
4. df1[[i]] is the same as unlist(df1[i]). And simpler.
5. After testing the code with df1[[i]], there were warnings, telling to 
use the pronoun .data, which I do.
6. The code repeated itself a lot, if you define aesthetics in the 
initial call to ggplot, there is no need to redefine them in the layers 
calls unless you are changing them. For instance, after

ggplot(df, mapping=aes(x = Age, y = unlist(df[i]), color=factor(AgeGroup)))


you don't have to define the same y and color again:

stat_cor(aes(color = factor(AgeGroup), y = unlist(df[i]))


7. Some arguments (method = "pearson" and others) didn't change their 
default values and were removed.


Now the code.
Note that before writing to file, the filename is output to stdin, 
remove it, it's not part of your original code.



theme_custom_ps <- function(){

   theme_classic() %+replace%    # replace elements we want to change

     theme(axis.text.x = element_text(face = "bold", size = 14),
           axis.text.y = element_text(face = "bold", size = 14),
           axis.title.x = element_text(face = "bold", size = 14),
           axis.title.y = element_text(face = "bold", size = 14),
           legend.text = element_text(face = "bold", size = 14, colour = 
"black"),
           legend.title = element_text(size = 12, colour = "black")
     )
}


library(ggplot2)
library(ggpubr)

df1 <- read.table("sim_data.txt", header = TRUE)

group_name <- c("old", "young")
f <- function(grp, rlab) sub("R", paste0("R[", grp, "]"), rlab)

for (i in names(df1)[3:6]) {
   p1 <- ggplot(df1, mapping = aes(x = Age, y = .data[[i]], color = 
factor(AgeGroup))) +
     geom_point(size = 4) +
     geom_smooth(method = "lm", formula = y ~ x) +
     geom_smooth(mapping = aes(group = 1), method = "lm", formula = y ~ x) +
     stat_cor(aes(label = paste(Map(f, group_name, ..r.label..), 
..p.label.., sep = "~`,`~")),
              label.x.npc = "center",
              show.legend = FALSE) +
     stat_cor(aes(label = paste(sub("R", expression("R"[overall]), 
..r.label..), ..p.label.., sep = "~`,`~"),
                  group = 1, color = "black"),
              label.y = 0.5,
              label.x.npc = "center",
              position = position_nudge(y = 0.015 * 0.5),
              show.legend = FALSE) +
     scale_colour_discrete(name = "Group", labels = c("Young", "Old", 
"Overall")) +
     scale_x_continuous(breaks = seq(20, 90, by = 10)) +
     scale_y_continuous(breaks = seq(0.1, 0.5, by = 0.1)) +
     expand_limits(y = 0.5) +
     ylab(i) +
     theme_custom_ps()

   pngfile <- paste0("TestAge_", i, ".png")
   cat("filename:", pngfile, "\n")
   ggsave(p1, file = pngfile, scale = 1, width = 16, height = 10, units 
= "cm")
}


So it seems this is worth the effort after all.
Just trickier than expected.


Hope this helps,

Rui Barradas

?s 02:20 de 12/07/20, Paulina Skolasinska escreveu: