Add geom_hline legend to existing geom legend

I want to add a legend according to the existing legend, which represents the dashed line, so that the dashed line can be marked as "avg tx effect" and put into study 3.

enter image description here

library(ggplot2)
library(ggthemes)

#dput(df)

df=structure(list(study = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("study1", "study2", 
"study3"), class = "factor"), d = c(-0.205, 0.1075, 0.3525, -0.37, 
0.3, 0.42, -0.28, 0.09, 0.59, 0.11, -0.05, 0.25, 0, 0.25, 0.49
), Outcome = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 
5L, 5L, 5L), Outcome2 = structure(c(1L, 1L, 1L, 4L, 4L, 4L, 7L, 
7L, 7L, 10L, 10L, 10L, 13L, 13L, 13L), .Label = c("1", "1", "1", 
"2", "2", "2", "3", "3", "3", "4", "4", "4", "5", "5", "5"), class = "factor")), .Names = c("study", 
"d", "Outcome", "Outcome2"), row.names = c(NA, -15L), class = "data.frame")

ggplot(df, aes(x=Outcome2, y=d, fill=study)) + 
   geom_bar(position=position_dodge(), aes(x=Outcome2),stat="identity",
             colour="black", # Use black outlines,
             size=.3) +      # Thinner lines
    xlab("Outcome") +
    ylab("Cohen D Effect Size") +
    scale_fill_grey(name="Study", 
                   labels=c("study1","study2", "study3"))+
        theme_bw()+
    geom_hline(yintercept=.15,linetype=2)   

      

+3


source to share


2 answers


As @Gregor suggested, you can use a direct label for this line by adding annotate()

like below:

ggplot(df, aes(x=Outcome2, y=d, fill=study)) + 
   geom_bar(position=position_dodge(), aes(x=Outcome2),stat="identity",
             colour="black", # Use black outlines,
             size=.3) +      # Thinner lines
    xlab("Outcome") +
    ylab("Cohen D Effect Size") +
    scale_fill_grey(name="Study", 
                   labels=c("study1","study2", "study3"))+
        theme_bw()+
    geom_hline(yintercept=.15,linetype=2) +annotate("text",x=.7,y=.17,size=3,label=c('avg tx ef')) 

      

enter image description here



If space is an issue, you can use the one wrapper

described here to wrap the text. Just run wrapper <- function(x, ...) paste(strwrap(x, ...), collapse = "\n")

, then add +annotate("text",x=.7,y=.18,size=3,label=wrapper('avg tx effect',10))

. What produces:

enter image description here

+2


source


A common feature ggplot

is that in order to generate the legend, you need to map the aunt aes

(for example linetype

) to a variable in the data, and not set it to a constant. In case geom_hline

this can be achieved by placing the intercept in a separate data frame. Also pay attention to show_guide = TRUE

.

Then customize the legend with scale_linetype_manual

. Black lines in the legend fill

are removed with override.aes

.

Here's a stripped down version of your code to show only the most essential steps:



df2 <- data.frame(yi = 0.15)

ggplot(data = df, aes(x = Outcome2, y = d, fill = study)) + 
  geom_bar(position = "dodge", stat = "identity") +
  geom_hline(data = df2, aes(yintercept = yi, linetype = factor(yi)), show_guide = TRUE) +
  scale_linetype_manual(name = "avg tx effect", values = "dashed", labels = "") +
  guides(fill = guide_legend(override.aes = list(linetype = "blank")))

      

enter image description here

+6


source







All Articles