rggplot2correlationggpubr

Issue in aligning stat_cor r-value and p-value displayed on two lines in R


I am using stat_cor with ggplot to add r-value and p-value to a scatter plot. I have used label.sep = "\n" to display the r-value and p-value on two lines. However the labels are not aligned properly and I am unable to left align the labels. I tried using hjust but it doesn't seem to work.

Here's the data

> dput(df)
structure(list(A = c(3.24792751344359, 11.6254805504711, 9.85096815098244, 
7.62570884306446, 4.6724253419715, 5.65821148275179, 14.4494388579437, 
2.16992500144231, 3.85798099512757, 15.4013962116234, 7.38801728534513, 
4.04439411935845, 7.10328780841202, 9.38909352190447, 9.87113518424304, 
12.751439451538, 3.95419631038688, 8.44914864537544, 12.8222720641578, 
9.65731844958129, 8.78626962764847, 7.94544383637791, 6.67948009950545, 
11.2243032093734, 9.46454575033394, 3.52356195605701, 4.49185309632967, 
11.7950249839614, 4.7279204545632, 6.876516946565, 9.59339112279174, 
11.1029598859101, 3.75488750216347, 8.35974956032233, 7.14465824283188, 
8.52160043972373, 5.65821148275179, 4.49185309632967, 3.85798099512757, 
10.8730595476615, 7.04984854945056, 6.21916852046216, 6.34872815423108, 
9.66977088852552, 15.1287394887056, 10.9833499276765, 4.93073733756289, 
7.2807707701306, 3.08746284125034, 8.82495874052852, 6.53138146051631, 
8.71252700043982, 13.7365604837545, 7.34429590791582, 12.4371018289084, 
3.24792751344359, 4.49185309632967, 4.7279204545632, 2.4594316186373, 
7.65463602852797, 4.88264304936184, 13.3752431107337, 5.4757334309664, 
4.49185309632967, 7.56605403817109, 6.66533591718518, 7.14465824283188, 
7.21431912080077, 8.38154295118458, 10.4120405145517, 5.14974711950468, 
14.717435454024, 12.9335984552372, 6.07681559705083, 8.05799172275918, 
10.4424251933316, 1.32192809488736, 8.62753388447279, 11.1147183891884, 
9.17866485100647, 9.54978466794786, 2.90689059560852, 5.62935662007961, 
5.06608919045777, 5.06608919045777, 3.52356195605701, 5.18982455888002, 
10.0409745988173, 14.2054496369478, 5.89481776330794, 11.3909750061555, 
14.4876202472075, 6.31288295528436, 10.1286388128526, 7.47167521439204, 
10.9155059622319, 7.3264294871223, 3.75488750216347, 8.49385544924082, 
-1), B = c(14.3127766206581, 14.4475675741951, 14.0405893950661, 
12.9728900634355, 13.8401386381809, 13.9348426545031, 14.0350997792022, 
13.7983199091531, 12.429799009167, 13.7326444284916, 13.5774878375881, 
14.1097082484888, 13.8667476715049, 14.041530822723, 14.2691632137112, 
13.540915056731, 13.7404659380353, 14.0689042060648, 14.3322114183684, 
13.5738246735046, 14.7685720383286, 13.760252139086, 12.9358096237511, 
13.6779948548276, 13.2124203878783, 12.7894317561295, 12.5645067843387, 
13.2555449905389, 13.9070314769172, 13.2381807936996, 13.1269464072255, 
13.7651306721844, 13.0182871274371, 14.9231185320901, 13.4296028886726, 
13.1441005563635, 12.7558264511331, 13.9863309334321, 13.3964040956219, 
14.1236768648636, 13.8001415579333, 13.0215872981245, 13.3918477190335, 
13.2864855672956, 13.1608956144507, 13.9778612496769, 14.2483352900365, 
13.3115354705716, 14.1847591417854, 14.0328636422936, 13.922445032087, 
13.9193754670122, 14.1792482216554, 14.1501836084154, 13.9839288136058, 
12.9035994534655, 13.771025140805, 14.0912287527363, 13.8237155308271, 
14.0047032739544, 13.8973255233125, 13.9361318028622, 13.7190144075454, 
14.1789371199985, 12.9471803166342, 13.550205673278, 13.9818794039634, 
14.0891607874707, 13.8560850466602, 14.2923575846826, 13.3177658951147, 
13.6720385382353, 13.9022337777197, 13.6913618610263, 12.9150390555186, 
14.0970033353301, 14.0115330268357, 13.2674450883881, 14.1581757415753, 
14.1520074961942, 14.175120670275, 13.8670373693052, 13.7511778994712, 
13.1295245193378, 13.6348677587679, 13.3826915668966, 13.1415483835874, 
13.7944666359748, 13.9242093993111, 13.8643312582358, 13.5818478602248, 
13.4147512917602, 13.6018288106901, 13.791722516366, 12.8720014654425, 
12.9857530107518, 13.4543635604993, 13.1279137392443, 14.1402306532103, 
13.6308927640127)), row.names = c(NA, -100L), class = c("tbl_df", 
"tbl", "data.frame"))

and the code

library(ggplot2)
library(ggpubr)


formula <- y ~ x
ggplot(data = df,
       aes(x = A,
           y = B)) +
  geom_point(alpha = 0.7) +
  geom_smooth(method = "lm",
              formula = formula,
              se = TRUE) +
  stat_cor(method = "pearson",
           show.legend = FALSE,
           cor.coef.name = "r",
           label.sep = "\n",
           label.x = 10,
           label.y = 12.6,
           size = 7) +
  theme_bw()


Solution

  • The issue is that stat_cor uses ?plotmath for the labels which does not allow for line breaks. Hence, when using label.sep="\n" it uses atop() to fake a line break which however center aligns the labels.

    One option to fix that would be to create the labels via two separate calls to stat_cor:

    library(ggplot2)
    library(ggpubr)
    
    formula <- y ~ x
    ggplot(
      data = df,
      aes(
        x = A,
        y = B
      )
    ) +
      geom_point(alpha = 0.7) +
      geom_smooth(
        method = "lm",
        formula = formula,
        se = TRUE
      ) +
      stat_cor(
        aes(label = after_stat(r.label)),
        method = "pearson",
        show.legend = FALSE,
        cor.coef.name = "r",
        label.x = 10,
        label.y = 12.7,
        size = 7
      ) +
      stat_cor(
        aes(label = after_stat(p.label)),
        method = "pearson",
        show.legend = FALSE,
        cor.coef.name = "r",
        label.x = 10,
        label.y = 12.5,
        size = 7
      ) +
      theme_bw()