我有以下数据,
SampleID Pos Dep Pvalues
sample_1 849 62 0.02755358
sample_1 859 63 0.07406833
sample_1 864 63 0.00351564
sample_1 883 60 0.02780868
sample_1 893 58 0.00451450
sample_1 895 58 0.03600795
样本_2 54 66 0.11864407
sample_2 55 67 0.01515152
样本_2 71 91 0.02712367
样品_2 78 97 0.00077325
我已经生成了一个p值的直方图,每个条形图的顶部都有频率值。下面是代码
pval_at_site<-read.table("samples.pval")
s<-hist(pval_at_site$Pvalues,xlab="pval",cex=0.8)
text(s$mids,s$count,s$count,srt=90,pos=3,offset=1,cex=0.6)
现在,我想做的是,连同p值频率,在每个条形图的顶部添加样本数量。
例如,如果我在第一个区间中有1000个数据点,并且这些值来自20个唯一的样本,我希望我的图在第一个栏的顶部显示"1000,20"。
请告诉我该怎么做。希望我已经说清楚了。
谢谢。
您可以计算唯一值的数量,并在hist()
计算之外生成文本标签。有更有效的方法可以实现这种拆分-应用-合并操作(查看dplyr
和data.table
),但下面的代码只需进行最小的更改即可实现:
data= "SampleID Pos Dep Pvalues
sample_1 849 62 0.02755358
sample_1 859 63 0.07406833
sample_1 864 63 0.00351564
sample_1 883 60 0.02780868
sample_1 893 58 0.00451450
sample_1 895 58 0.03600795
sample_2 54 66 0.11864407
sample_2 55 67 0.01515152
sample_2 71 91 0.02712367
sample_2 78 97 0.00077325"
pval_at_site <- read.table(text=data, header=TRUE)
s <- hist(pval_at_site$Pvalues, xlab="Pval",cex=0.8)
# get a vector of each bin
bins <- cut(pval_at_site$Pvalues, breaks=s$breaks)
# get sum of unique values by bin value based on hist() output
count.samples <- tapply(pval_at_site$SampleID, bins, function(x) length(unique(x)))
count.samples[is.na(count.samples)] <- 0 ## remove NAs from empty bins
# generate text labels by combining both values
tags <- paste(s$count, count.samples, sep=" - ")
text(s$mids,s$counts,tags,srt=90,pos = 3,offset=1,cex=0.6)