在直方图中将两个值放在每个条形的顶部

时间:2014-10-13 09:19:18

标签: r histogram plotrix

我有以下数据,

  

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

我已经生成了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"在第一个酒吧的顶部。

请让我知道我应该怎么做。希望我已经说清楚了。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以计算唯一值的数量,并生成hist()次计算之外的文本标签。有更有效的方法可以执行这种拆分 - 应用 - 组合操作(查看dplyrdata.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)