将条形图绘制为ggplot中的密度图

时间:2014-11-11 11:23:08

标签: r ggplot2

有人可以帮我将下面的数据绘制为密度图,其中colour=variable

> head(combined_length.m)
  length                     seq           mir variable     value
1     22  TGAGGTATTAGGTTGTATGGTT mmu-let-7c-5p     Ago1  8.622468
2     23 TGAGGGAGTAGGTTGTATGGTTT mmu-let-7c-5p     Ago1 22.212471
3     21   TGAGGTAGTAGGTTGCATGGT mmu-let-7c-5p     Ago1  9.745199
4     22  TGAGGTAGTATGTTGTATGGTT mmu-let-7c-5p     Ago1 11.635982
5     22  TGAGTTAGTAGGTTGTATGGTT mmu-let-7c-5p     Ago1 13.203627
6     20    TGAGGTAGTAGGCTGTATGG mmu-let-7c-5p     Ago1  7.752571

ggplot(combined_length.m, aes(factor(length),value)) + geom_bar(stat="identity") + facet_grid(~variable) +
  theme_bw(base_size=16

我尝试了这个没有成功:

ggplot(combined_length.m, aes(factor(length),value)) + geom_density(aes(fill=variable), size=2)

Error in data.frame(counts = c(167, 9324, 177, 150451, 62640, 74557, 4,  : 
  arguments imply differing number of rows: 212, 6, 1, 4

enter image description here

我想要这样的事情:

http://i.stack.imgur.com/qitOs.jpg enter image description here

1 个答案:

答案 0 :(得分:2)

factor(length)用于x似乎会产生问题。只需使用length即可。

此外,密度图显示您定义为x的任何内容的分布。因此,根据定义,y轴是给定值x的密度。在您的代码中,您似乎试图同时指定xy,这没有任何意义。您可以在y中指定geom_density(...),但这会控制缩放比例,如下所示。 [注意:您的示例只有一种variable(Ago1),所以我创建了一个人工数据集。

set.seed(1)   # for reproducible example
df <- data.frame(variable=rep(LETTERS[1:3],c(5,10,15)),
                 length  =rpois(30,25),
                 value   =rnorm(30,mean=20,sd=5))

library(ggplot2)
ggplot(df,aes(x=length))+geom_density(aes(color=variable))

在此表示中,每条曲线下的区域为1.这与设置y=..density..

相同
ggplot(df,aes(x=length))+geom_density(aes(color=variable,y=..density..))

您还可以设置y=..count..根据计数进行缩放。在此示例中,由于C有15个观察值,A只有5个,蓝色曲线(C)的面积是红色曲线的三倍(A )。

ggplot(df,aes(x=length))+geom_density(aes(color=variable,y=..count..))

您还可以设置调整曲线的y=..scaled..,使每个曲线的最大值对应1。

ggplot(df,aes(x=length))+geom_density(aes(color=variable,y=..scaled..))

最后,如果您想摆脱所有烦人的额外行,请改用stat_density(...)

ggplot(df,aes(x=length))+
  stat_density(aes(color=variable),geom="line",position="identity")