2

我有一个看起来像这样的数据

ensg mirna_hgc time value perc id
ENSG00000211521 MIR665 x 89 2.07612456747405 1
ENSG00000207787 MIR98 x 73 1.73010380622837 2
...
ENSG00000207827 MIR30A y 99 21.4532871972318 288
ENSG00000207757 MIR93 y 94 1.73010380622837 289

我正在尝试做的是创建一个带有标签的构面图。标签可以很容易地从perc列中调用。

使用此代码:

dat.m <- read.delim("http://dpaste.com/1271039/plain/",header=TRUE,sep=" ")

qplot(value, data=dat.m,facets=time~.,binwidth=1,main="")+
xlab("Value")+ ylab("Count")+
theme(legend.position="none")+
stat_bin(aes(value,label=sprintf("%.01f",perc)),geom="text")

但它给了我这个错误:

Error: geom_text requires the following missing aesthetics: label

我想要做的是生成这个情节: 在此处输入图像描述

4

1 回答 1

4

您的问题部分出现

  • 因为您正在使用qplot(这使事情变得比您需要的更混乱)。

  • 您已设置binwidth = 2这意味着每个直方图条都(可能)基于 2 个值。您的 perc 到 value 的 1 对 1 映射现在是 perc 到 binned 值的 2 对 -1 映射

用于继续hadleyesqueplyr实现,我们可以在绘制之前进行聚合

library(plyr)
agg.data <-  ddply(dat.m, .(value,time), summarize, p = unique(perc), n = length(perc))

ggplot(agg.data, aes(x= value)) + 
 geom_bar(aes(y = n),stat='identity') + 
 facet_grid(time~.) + 
 geom_text(aes(y=n, label = sprintf('%.01f',p)),vjust=-1,size=3)

在此处输入图像描述

如果您想使用geom_histogram和显示与每个条相关的比例,这可以很容易地完成,但是您需要使用由stat_bin(即..density..,分配给每个条的比例)创建的值

ggplot(dat.m, aes(x= value)) + 
  geom_histogram(binwidth=2) +  
  facet_grid(time~.) + 
  stat_bin(aes(y = ..count.., label = sprintf('%.01f', 100 * ..density..)),
           binwidth=2,geom='text',vjust = -1)

在此处输入图像描述

并替换0.0没有标签的使用ifelse(使用一些定义技巧来避免复制测试。

ggplot(dat.m, aes(x= value)) + 
   geom_histogram(binwidth=2) +  facet_grid(time~.) + 
   stat_bin(aes(y = ..count.., 
     label = ifelse(test = (xxx <- sprintf('%.01f', 100 * ..density..))=='0.0','',xxx)),
     binwidth=2,geom='text',vjust = -0.7)

在此处输入图像描述

请注意,您可以使用qplotusing

qplot(value, data=dat.m,facets=time~.,binwidth=2,main="")+
     xlab("Value")+ ylab("Count")+
     theme(legend.position="none")+
     stat_bin(aes(value,label=ifelse(test = (xxx <-  
       sprintf("%.01f",..density..*100))=='0.0','',xxx)),geom="text",binwidth=2,vjust = -0.7)
于 2013-06-26T04:19:19.883 回答