2015-07-21 119 views
3

我想在现有图例下添加一个代表虚线的图例,以便虚线可以标记为“avg tx effect”并放置在研究3下。将geom_hline图例添加到现有的几何条形图例

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's D Effect Size") + 
    scale_fill_grey(name="Study", 
        labels=c("study1","study2", "study3"))+ 
     theme_bw()+ 
    geom_hline(yintercept=.15,linetype=2) 
+0

对剧情的直接文本标签会很容易... – Gregor

回答

2

由于@Gregor建议,你可以通过添加annotate()使用直接标签这条线,如下图所示:

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's 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

如果空间有问题,您可以使用wrapper描述的here来包装文本。只需运行wrapper <- function(x, ...) paste(strwrap(x, ...), collapse = "\n"),然后添加+annotate("text",x=.7,y=.18,size=3,label=wrapper('avg tx effect',10))。主要生产:

enter image description here

6

ggplot的一般特点是生成一个传说,你需要地图aes thetics(如linetype)在数据的变量,而不是设置它以不变。在geom_hline的情况下,这可以通过将截取置于单独的数据帧中来实现。还请注意show_guide = TRUE

然后使用scale_linetype_manual自定义图例。使用override.aes删除fill图例中的黑线。

这是你的代码的精简版,只显示了最必要的步骤:

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