我使用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)
虽然情节正是我想要的,但我想将这条纯黑线添加到方框下面的图例中。&#34; Mean&#34;名字说&#34;整体&#34;。这是我陷入困境的地方,我根本不知道如何自定义图例,因为我没有多少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)
现在我确实有一个传奇,但是我想改变线条的颜色与密度相同,更重要的是我需要更改&#34;整体&#34;线条到坚实的深色,再次遇到了定制问题。
我真的很感激任何人的帮助。感谢
答案 0 :(得分: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()
给出:
答案 1 :(得分:2)
使用以下&#34; hack&#34; (使用您的gp2
),使用scale_color_manual
创建手动色阶,您可以获得整体均值的实线和&#34;整体&#34; - 但在传说中,&#34;整体&#34;的线型仍然破灭:
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的图例功能,我认为不可能做到你真正想要的那样:任何一个传奇盒子(比如&#34;意思是&#34;和#34;类型&#34;在你的例子中)区分了一个图形特征,如颜色,线型等......你想要的是一个图例框中的特征(颜色和线型的不同组合)的混合。也许您考虑为整体平均值引入一个新的图例框?
编辑:可以在一个框中指定手动色标和线型比例,请参阅Jaap的帖子:)