繁体   English   中英

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

[英]R - customizing legend in ggplot2 to add geom_vline() component

我使用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)

在此输入图像描述

将摘要信息添加为垂直线后。 情节看起来像这样

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)

在此输入图像描述

虽然情节正是我想要的,但我想将这条纯黑色线条添加到“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)

在此输入图像描述

现在我有一个传奇,但我想改变线条的颜色与密度相同,更重要的是我需要将“整体”线改为纯黑色,再次遇到定制问题。

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

可能最简单的方法是指定手动色阶和线型比例,如下所示:

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

这使:

在此输入图像描述

使用以下“hack”(使用gp2 ),使用scale_color_manual创建手动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的图例功能,我认为不可能实现你真正想要的:任何图例框(如你的例子中的“mean”和“type”)都区分了一个图形特征,如颜色, linetype等...你想要的是一个图例框中的特征(颜色和线型的不同组合)的混合。 也许你考虑为整体意味着引入一个新的传奇盒子?

编辑:可以在一个框中指定手动色标和线型比例,请参阅Jaap的帖子:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM