2015-11-04 195 views
3

我使用ggplot2创建了混合密度图,我想在图中添加汇总信息,即每个密度的平均值和代表某种真实平均值的1值。R - 在ggplot2中定制图例以添加geom_vline()组件

这里是一个模拟的例子,来自@Hernando Casas。

set.seed(1234) 
data <- data.frame(value = rnorm(n = 10000, mean =50, sd = 20), 
       type = sample(letters[1:2], size = 10000, replace = TRUE)) 
data$value[data$type == "b"] <- data$value[data$type == "b"] + 
rnorm(sum(data$type == "b"), mean = 55) 
library(ggplot2) 
gp <- ggplot(data=data, aes_string(x="value")) 
gp <- gp + geom_density(aes_string(fill="type"), alpha=0.3) 

enter image description here

添加的摘要信息作为垂直线之后。剧情是这样的

vlines <- data.frame(value = c(mean(data$value[data$type == "a"]), mean(data$value[data$type == "b"])),Mean = c("A", "B")) 

gp2 <- gp + geom_vline(data=vlines, 
        aes(xintercept=value, colour=Mean), 
        size=1.05, linetype="dashed", show_guide=TRUE) 
gp3 <- gp2+geom_vline(xintercept=(50+55+50)/2, 
       size=1.05) 

enter image description here

虽然情节是我想要什么,我想这黑色实线添加入禁区“中庸”与一个名称下的传奇说“总体”。这是我陷入困境的地方,我根本不知道如何定制传奇,因为我没有太多的经验ggplot2

我发现了一些例子和修改我的代码

gp <- ggplot(data=data, aes_string(x="value")) 
gp <- gp + geom_density(aes_string(fill="type"), alpha=0.3) 

vlines <- data.frame(value = c(mean(data$value[data$type == "a"]), 
          mean(data$value[data$type == "b"]), 
          (50+55+50)/2), 
       Mean = c("A", "B", "Overall")) 

gp2 <- gp + geom_vline(data=vlines, 
        aes(xintercept=value, colour=Mean), 
        size=1.05, linetype="dashed", show_guide=TRUE) 

enter image description here

现在我有一个传说,但我想改变线条的颜色是一样的密度,更重要的是我需要将“整体”行改为纯黑色,我又遇到了定制问题。

我真的很感激任何人的帮助。谢谢

回答

4

也许最简单的方法是只指定一个手动颜色规模和线型规模如下:

ggplot(data=data, aes(x=value)) + 
    geom_density(aes(fill=type), alpha=0.3) + 
    geom_vline(data=vlines, 
      aes(xintercept=value, colour=Mean, linetype=Mean), 
      size=1.05, show_guide=TRUE) + 
    scale_color_manual(values = c("red","green","black")) + 
    scale_linetype_manual(values = c(2,2,1)) + 
    theme_bw() 

这给:

enter image description here

+0

要获得与填充完全相同的颜色,可以使用'scale_color_manual(values = c(“#F8766D”,“#00BFC4”,“black”))''。资料来源:gg_color_hue函数来自http://stackoverflow.com/a/8197703/5020008 – Heroka

2

使用以下“hack”(使用您的gp2),使用scale_color_manual创建手动色阶,可以得到整体平均值的实线和“整体”的图例条目 - 但在图例中,线型的“总体”仍然是虚线:

gp3 <- gp2+geom_vline(mapping=aes(color="Overall", xintercept=(50+55+50)/2), 
         linetype="solid", size=1.05) 
cols <- c('black', 'red', 'green') 
names(cols) <- c("Overall", "A", "B") 
gp4 <- gp3 + scale_color_manual(values = cols, name = "Mean") 

据我了解GGPLOT2的传说功能,我认为这是不可能做到这一点你真正想要的:任何图例框(如“平均”和“键入“在你的例子中)确切地区分一个图形特征,如颜色,线型等...你想要什么,是在一个图例框中混合的特征(颜色和线型的不同组合)。也许你考虑为整体的意思引入一个新的传奇盒子?

编辑:有可能在一个盒子到指定手动颜色规模和线型比例,见夏侯的帖子:)

+0

非常感谢,这是非常有帮助的。我看到你的观点,在我的情况下,我可能应该创建一个新的传奇盒子,我可以再次打扰你如何做到这一点? –