如何在R中将多个密度曲线叠加到一个图中

6

我有一份数据,看起来像这样this

我希望创建多个密度曲线到一个图中,其中每条曲线对应唯一的ID。

我尝试使用"sm"包和这段代码,但没有成功。

library(sm)
dat <- read.table("mydat.txt");
plotfn <- ("~/Desktop/flowgram_superimposed.pdf");
pdf(plotfn);

sm.density.compare(dat$V1,dat$V2, xlab = "Flow Signal")
colfill <- c(2:10);
legend(locator(1), levels(dat$V2), fill=colfill)

dev.off();

请指导正确的方法,或者是否有其他方法可以实现?
我试图在最后得到这种类型的图表。 figure http://img524.imageshack.us/img524/2736/testl.png

2
同时在这里和R-list上提问:不好。http://www.nabble.com/Howto-Superimpose-Multiple-Density-Curves-Into-One-Plot-td25254899.html - Eduardo Leoni
我不确定我理解为什么,考虑到两组用户之间还没有太多的重叠。你能详细说明为什么不应该这样做吗? - Matt Parker
1
“多次发布同一内容是浪费带宽、金钱和人力的无益行为,不应该被纵容。” http://bit.ly/Ja5n1 。虽然现在前两个理由可能不那么重要了,但我珍惜时间,不喜欢在多个列表中阅读相同的消息。 - Eduardo Leoni
1
我同意在多个地方发布多篇文章可能是浪费时间的。但另一方面,这是一个展示 Stack Overflow 作为一个比列表服务更优越的论坛来回答问题的机会。 - medriscoll
1
好吧,我收回之前的话。既然我们都想要增加SO(和R!)的流行度,那么现在越多越好。 - Eduardo Leoni
4个回答

11

尝试使用ggplot2:

dnow <- read.table("http://dpaste.com/88561/plain/")
library(ggplot2)
qplot(V1, colour=factor(V2), data=dnow, geom="density")

1
链接已经失效了。这样我就无法很好地理解你的解决方案是什么了。你能修复一下链接吗?谢谢... - Manoel Galdino
3
@Manoelqplot(mtcars$drat, colour=factor(mtcars$cyl), data=mtcars, geom="density") 这条命令应该可以给你一个可用的实例。 - unode

4
您也可以使用lattice软件包来解决这个问题。
require(lattice)
dnow <- read.table('http://dpaste.com/88561/plain/')
densityplot(~V1, groups=V2, data=dnow)

3

以意大利面条式编程方式使用基础图形:

plot.multi.dens <- function(s)
{
junk.x = NULL
junk.y = NULL
for(i in 1:length(s))
{
junk.x = c(junk.x, density(s[[i]])$x)
junk.y = c(junk.y, density(s[[i]])$y)
}
xr <- range(junk.x)
yr <- range(junk.y)
plot(density(s[[1]]), xlim = xr, ylim = yr, main = "")
for(i in 1:length(s))
{
lines(density(s[[i]]), xlim = xr, ylim = yr, col = i)
}
}
dnow <- read.table("http://dpaste.com/88561/plain/")
library(sqldf)
x <- unlist(sqldf("select V1 from dnow where V2==0"))
y <- unlist(sqldf("select V1 from dnow where V2==1"))
z <- unlist(sqldf("select V1 from dnow where V2==2"))
plot.multi.dens(list(x,y,z))
library(Hmisc)
le <- largest.empty(x,y,.1,.1)
legend(le,legend=c("x","y","z"), col=(1:3), lwd=2, lty = 1)

3
为什么要在这里使用sqldf?它的速度比下标操作慢100倍:x <- with(dnow,V1[V2==0]) - Eduardo Leoni
你是对的。但我喜欢sqldf包和方法,所以我倾向于以无脑的方式使用它;-) - Paolo

1

在查看微阵列数据时,我发现自己经常需要做这件事情,因此我将其作为实用程序代码库的一部分放在了github上:ARE.utils,特别是plot.densities函数。

它使用基本图形,因此您可以从该函数中获得灵感来创建自己的函数,或者直接采用它(但它依赖于该库中的其他函数):

  1. create.densities,它将数据列表/矩阵等转换为密度列表;以及
  2. match.dim函数(将维度“名称”转换为数字轴)。

(您可以选择安装整个软件包,但我不能保证其中的函数不会以某种不向后兼容的方式更改)。

编写自己的函数并不难,但是要确保函数在轴和其他方面选择正确的范围。无论如何,您将使用以下代码:

library(ARE.utils)
# Create a matrix dataset with separate observations in columns
dat <- matrix(c(rnorm(100), rnorm(100, mean=3), 
                rnorm(100, mean=3, sd=2)),
              ncol=3)
# Plot them
plot.densities(dat, along='cols')

这将在同一轴上创建三个不同密度图,每个图都有自己的颜色。


如果这个内容有用并且能通过R CMD检查,请务必将其发送到CRAN。如果它尚未通过R CMD检查,请先解决这一部分,然后返回到上一步 :) - Dirk Eddelbuettel
Dirk,你是在暗示向后兼容性不应该太过关注吗? - Eduardo Leoni
Eduardo: 这与向后兼容性有什么关系? 在SO之外随时给我发电子邮件。 我真的不理解你的问题。 - Dirk Eddelbuettel
Dirk:我认为他正在注意我提到ARE.utils可能会有不兼容的更改。像Eduardo一样,我会(错误地?)期望CRAN上的包会比我这里更好维护/设计。虽然我尽力设计/实现这些东西,但也很常见发现我重新实现了一些在base::R中可以用几个命令更好完成的工作,并随后将其从库中删除。也许有一天,如果我觉得它足够好,我会提交到CRAN,但直到那时,我很高兴让其他人将其用于灵感来源 :-) - Steve Lianoglou

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