我有一个像这样的数据框w
:
>head(w,3)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
1 0.2446884 0.3173719 0.74258410 0.0000000 0 0.0000000 0.01962759 0.0000000 0.0000000 0.5995647 0 0.30201691 0.03109935 0.16897571
2 0.0000000 0.0000000 0.08592243 0.2254971 0 0.7381867 0.11936323 0.2076167 0.0000000 1.0587742 0 0.50226734 0.51295661 0.01298853
3 8.4293893 4.9985040 2.22526463 0.0000000 0 3.6600283 0.00000000 0.0000000 0.2573714 0.8069288 0 0.05074886 0.00000000 0.59403855
V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27
1 0.00000000 0.0000000 0.000000 0.1250837 0.000000 0.5468143 0.3503245 0.000000 0.183144204 0.23026538 6.9868429 1.5774150 0.0000000
2 0.01732732 0.8064441 0.000000 0.0000000 0.000000 0.0000000 0.0000000 0.000000 0.015123385 0.07580794 0.6160713 0.7452335 0.0740328
3 2.66846151 0.0000000 1.453987 0.0000000 1.875298 0.0000000 0.0000000 0.893363 0.004249061 0.00000000 1.6185897 0.0000000 0.7792773
V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 refseq
1 0.5543028 0 0.00000 0.0000000 0.08293075 0.18261450 0.3211127 0.2765295 0 0.04230929 0.05017316 0.3340662 0.00000000 NM_000014
2 0.0000000 0 0.00000 0.0000000 0.00000000 0.03531411 0.0000000 0.4143325 0 0.14894716 0.58056304 0.3310173 0.09162460 NM_000015
3 0.8047882 0 0.88308 0.7207709 0.01574767 0.00000000 0.0000000 0.1183736 0 0.00000000 0.00000000 1.3529881 0.03720155 NM_000016
dim(w)
[1] 37126 41
我试图在一个页面中绘制每列(最后一列除外)的密度曲线。似乎ggplot2可以做到这一点。
我根据this post尝试了这个:
ggplot(data=w[,-41], aes_string(x=colnames)) + geom_density()
但这样的抱怨不起作用:
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
而且我不确定如何将此数据帧的格式转换为ggplot2接受的格式。或者还有其他方法可以在R中完成这项工作吗?
答案 0 :(得分:5)
ggplot
需要长格式的数据,例如:
variable value
1 V1 0.24468840
2 V1 0.00000000
3 V1 8.42938930
4 V2 0.31737190
一旦融入长数据框,您可以按变量对所有密度图进行分组。在下面的代码段中,ggplot
使用w.plot
数据框进行绘图(不需要省略最终的refseq
变量)。您可以修改它以使用构面,不同颜色,填充等。
w <- as.data.frame(cbind(
c(0.2446884, 0.0000000, 8.4293893),
c(0.3173719, 0.0000000, 4.9985040),
c(0.74258410, 0.08592243, 2.22526463)))
w$refseq <- c("NM_000014", "NM_000015", "NM_000016")
library(ggplot2)
library(reshape2)
w.plot <- melt(w)
p <- ggplot(aes(x=value, colour=variable), data=w.plot)
p + geom_density()
答案 1 :(得分:4)
使用“reshape”包中的“melt”(你也可以使用base reshape函数,但这是一个更复杂的调用)。
require (reshape)
require (ggplot2)
long = melt(w, id.vars= "refseq")
ggplot(long, aes (value)) +
geom_density(color = variable)
# or maybe you wanted separate plots on the same page?
ggplot(long, aes (value)) +
geom_density() +
facet_wrap(~variable)
还有很多其他方法可以在ggplot中绘制这个:请参阅 http://docs.ggplot2.org/0.9.3.1/geom_histogram.html例如。
答案 2 :(得分:2)
这是使用plot
函数和一个小循环
调用你的情节
plot(density(df[,1]), type = "n")
然后运行它来添加行
n = dim(df)[2]-1
for(i in 1:n){
lines(density(c(df[,i])))
}