rlistggplot2geom-texttukey

Is there a way to import the results of HSD.test from agricolae directly into geom_text() in a ggplot2?


I'm creating figures that show the efficacy of several warning signals relative to the event they warn about. The figure is based off a dataframe which is produced by a function that runs a model multiple times and collates the results like this:

     t  type           label     early
4  847 alarm         alarm.1        41
2  849 alarm         alarm.2        39
6  853 alarm         alarm.3        35
5  923 alarm         alarm.4       -35
7 1003 alarm         alarm.5      -115

But with a dozen alarms and a value for each alarm n times (typically 20 - 100), with each value being slightly different depending on random and stochastic variables built into the model.

I'm putting the results in an lm

a.lm <- lm(log(early + 500) ~ label, data = alarm.data)

and after checking the assumptions are met, running a 1 way anova

anova(a.lm)

then a tukey post hoc test

HSD.test(a.lm, trt = "label", console = TRUE)

Which produces

                log(early + 500) groups
alarm.1                     6.031453      a
alarm.2                     6.015221      a
alarm.3                     6.008366      b
alarm.4                     5.995150      b
alarm.5                     5.921384      c

I have a function which generates a ggplot2 figure based on the collated data, to which I am then manually adding +geom_text(label = c("a", "a", "b", "b", "c") or whatever the appropriate letters are. Is there a way to generalise that last step? Calling the letters directly from the result of the HSD.test. If I put the results of the HSD.test into an object

a.test <- HSD.test(a.lm, trt = "label", console = TRUE)

I can call the results using a.test$groups and calling the letter groupings specifically using a.test$groups$groups but I don't know enough about manipulating lists to make that useful to me. Whilst the order of the labels in the ggplot is predictable, the order of the groups in the HSD.test result isn't and can vary a lot between iterations of the model running function.

If anyone has any insights I would be grateful.


Solution

  • Okay I actually bumped into a solution just after I posted the question.

    If you take the output of the HSD.test and make it into an object

    a.test <- HSD.test(ram.lm, trt = "label")
    

    Then convert the groups list into a dataframe

    a.df <- as.data.frame(a.test$groups)
    

    The row index is the alarm names rather than numbers

    a.df
    
                    log(early + 500) groups
    alarm.1                      6.849082      a
    alarm.2                      6.842465      a
    alarm.3                      6.837438      a
    alarm.4                      6.836437      a
    alarm.5                      6.812714      a
    

    so they can be called specifically into geom_text inside the function

    a.plot +
    geom_text(label = c(a.df["alarm.1",2],
                          a.df["alarm.2",2],
                          a.df["alarm.3", 2], 
                          a.df["alarm.4", 2], 
                          a.df["alarm.5", 2])