ggplot2中的重叠密度图

7

假设我有两个长度不同的向量,我想要生成一个密度曲线图,将两个向量的密度曲线叠加在一起。我认为我应该这样做:

vec1 <- data.frame(x=rnorm(2000, 0, 1))
vec2 <- data.frame(x=rnorm(3000, 1, 1.5))
ggplot() + geom_density(aes(x=x, colour="red"), data=vec1) + 
  geom_density(aes(x=x, colour="blue"), data=vec2)

然后我想我应该这样做:

vec1 <- data.frame(x=rnorm(2000, 0, 1))
vec2 <- data.frame(y=rnorm(3000, 1, 1.5))
ggplot() + geom_density(aes(x=x, colour="red"), data=vec1) + 
  geom_density(aes(x=y, colour="blue"), data=vec2)

这两种方法都不太行,因为颜色会混淆。

根据我在StackOverflow上找到的另一个解决方案12,我意识到应该尝试这个:

vec1 <- data.frame(x=rnorm(2000, 0, 1), grp="vec1")
vec2 <- data.frame(x=rnorm(3000, 1, 1.5), grp="vec2")
allDat <- rbind(vec1, vec2)

ggplot(allDat, aes(x, colour=grp)) + geom_density()

ggplot(allDat, aes(x, colour=grp)) + geom_density() + 
  scale_colour_manual(values=c("green", "blue"))

ggplot(allDat, aes(x, colour=grp)) + geom_density() + 
  scale_colour_manual(values=c(vec2="green", vec1="blue"))

好的,我解决了我的原始问题。但是是否有一种类似于我上面尝试过的第一种方法的方式?从ggplot文档中的措辞来看,我本以为会有这样的方式。感谢任何建议。


你可能可以在第一次尝试中添加 scale_colour_manual(values = c('blue','red')),但最后一次尝试可能是更被接受的方法。 - joran
嗯,不行。这也不行。 - rmflight
你需要更具体一些,因为它对我来说运行得很好。 - joran
使用: ggplot() + geom_density(aes(x=x, colour="red"), data=vec1) + geom_density(aes(x=x, colour="blue"), data=vec2) + scale_colour_manual(values=c('red', 'blue')) 是的,它改变了颜色。但是,它将错误的颜色分配给了错误的分布。对我来说,0 中心分布是蓝色的,均值为 1 的更宽分布是红色的,而我要求相反的情况。 - rmflight
嗯...所以在两个geom_density调用中交换它们来将它们反转回来?我意识到这很反常,但你的第一次尝试并不符合ggplot中图例逻辑的工作方式。你不能在几何对象中为事物分配颜色标签。这不是正确的做法。 - joran
3个回答

20

如果将colour参数的赋值移出aes(),一切都会正常工作。

vec1 <- data.frame(x=rnorm(2000, 0, 1))
vec2 <- data.frame(x=rnorm(3000, 1, 1.5))

library(ggplot2)

ggplot() + geom_density(aes(x=x), colour="red", data=vec1) + 
  geom_density(aes(x=x), colour="blue", data=vec2)

在此输入图片描述


那就是一直让我困扰的“小”波浪线。我找到的所有示例都在aes()中显示了colour。谢谢,当我有一些真正的向量不想连接成一个数据框时,这可能会很有用。 - rmflight

4
如果您想要拥有图例,可以尝试以下方法:
df <- rbind(data.frame(x=rnorm(2000, 0, 1), vec='1'),
            data.frame(x=rnorm(3000, 1, 1.5), vec='2'))
ggplot(df, aes(x, group=vec, col=vec)) + geom_density(position='dodge')

enter image description here


0

我曾经遇到了一些问题,因为我的数据都包含在一个数据框中。在美学上使用 ... data=df$A 是不起作用的,因为这将向 ggplot 提供一个 "numeric" 类型的向量,而这是不被支持的。

因此,为了叠加来自同一个数据框的不同列,我建议:

vec1 <- rnorm(3000, 0, 1)
vec2 <- rnorm(3000, 1, 1.5)

df <- data.frame(vec1, vec2)
colnames(df) <- c("A", "B")

library(ggplot2)

ggplot() + geom_density(aes(x=df$A), colour="red") + 
  geom_density(aes(x=df$B), colour="blue")

enter image description here

对大多数人来说,这可能很明显,但对于我这样的初学者来说并不是。 希望这有所帮助。


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