在ggplot2中自定义图例以添加geom_vline()组件

3
我使用ggplot2创建了一个混合密度图,希望在图中添加摘要信息,即每个密度的均值和代表某种真实均值的1个值。
这是从@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

虽然情节正是我想要的,但我想在图例中添加一条实线,放在框“Mean”下面,命名为“Overall”。这就是我卡住的地方,因为我对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

现在我有一个图例,但我想将线条的颜色改为与密度相同,更重要的是,我需要将“Overall”线条更改为纯深色,但我遇到了自定义问题。 我真的很感激任何人的帮助。谢谢。
2个回答

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()

这将会得到:

在此输入图片描述


要获得与填充完全相同的颜色,您可以使用scale_color_manual(values = c("#F8766D","#00BFC4","black"))。来源:gg_color_hue函数来自https://dev59.com/Bmsy5IYBdhLWcg3w9i1u#8197703 - Heroka
show_guide is deprecated. It is now called as show.legend - patL

2
使用以下“hack”(使用您的gp2),使用scale_color_manual创建手动颜色比例尺,您可以获得总体均值的实线和“overall”的图例条目 - 但在图例中,“overall”的线型仍为虚线:
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的图例功能,我认为你想要的是不可能实现的:任何图例框(比如你示例中的“平均值”和“类型”)只能区分一种图形特征,比如颜色、线型等。而你想要的是在一个图例框中混合多个特征(不同颜色和线型的组合)。也许你可以考虑引入一个新的图例框来表示整体平均值?
编辑:可以在一个框中指定手动颜色比例尺和线型比例尺,请参见Jaap的帖子 :)

非常感谢,这很有帮助。我了解您的观点,在我的情况下,我可能应该创建一个新的图例框,能否再麻烦您一次,告诉我如何做到这一点? - Christopher B. L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接