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 1 2中找到的另一个解决方案,我意识到我应该试试这个:

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,我会这么认为。感谢任何建议。

4

3 回答 3

19

如果您将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)

在此处输入图像描述

于 2012-08-30T17:35:28.570 回答
3

如果你也想要传说,试试这个:

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

在此处输入图像描述

于 2016-10-12T12:01:36.007 回答
0

我在使用上述解决方案时遇到了一些问题,因为我的数据包含在单个数据框中。在美学中使用... data=df$A不起作用,因为这将为 ggplot 提供一个不支持的“数字”类向量。

因此,要覆盖所有包含在同一数据框中的不同列,我建议:

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

在此处输入图像描述

对于大多数人来说,这似乎很明显,但对于我作为初学者来说,它不是。希望这可以帮助。

于 2016-10-12T11:02:41.820 回答