想象一下,我有两个不同长度的向量。我想生成一个图,其中两个矢量的密度重叠。我认为我应该做的是:
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
文档中的措辞方式来看,我会这么认为。感谢任何建议。
答案 0 :(得分:18)
如果您将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)
答案 1 :(得分: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')
答案 2 :(得分:0)
我遇到了上述解决方案的一些麻烦,因为我的数据包含在一个数据框中。在美学中使用...
data=df$A
不起作用,因为这将为ggplot提供类“vector”的向量,这是不受支持的。
因此,为了覆盖同一数据框中包含的不同列,我建议:
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")
对于大多数人来说,这似乎是显而易见的,但对我来说,作为初学者,事实并非如此。 希望这会有所帮助。