2014-11-24 58 views
2

我目前中的R用ggplot生成以下情节:超过直方图绘制垂直位数线

的数据被存储在单个数据帧具有三列:PDF(y轴中的情节上述),mids(x)和数据集名称。这是从直方图创建的。
我想要做的就是绘制为代表的95位数,就像我手工画下面作为一个例子中,每个数据集彩色编码的垂直线:

我试图用+ geom_line(stat="vline", xintercept="mean")当然,但我正在寻找分位数,而不是中位数,AFAIK ggplot不允许。颜色很好。
我也试过+ stat_quantile(quantiles = 0.95),但我不确定它究竟做了什么。文档非常稀少。颜色,也很好。

请注意,密度值非常低,低至1e-8。我不知道quantile()函数是否喜欢。

据我所知,计算直方图的分位数与计算数列表的分位数并不完全相同。我不知道它会有什么帮助,但HistogramTools包中包含用于直方图分位数的函数ApproxQuantile()

最小工作示例如下。正如你所看到的,我从每个直方图中获得一个数据帧,然后将这些数据帧绑定在一起并绘制出来。

library(ggplot2) 
v <- c(1:30, 2:50, 1:20, 1:5, 1:100, 1, 2, 1, 1:5, 0, 0, 0, 5, 1, 3, 7, 24, 77) 
h <- hist(v, breaks=c(0:100)) 
df1 <- data.frame(h$mids,h$density,rep("dataset1", 100)) 
colnames(df1) <- c('Bin','Pdf','Dataset') 
df2 <- data.frame(h$mids*2,h$density*2,rep("dataset2", 100)) 
colnames(df2) <- c('Bin','Pdf','Dataset') 
df_tot <- rbind(df1, df2) 

ggplot(data=df_tot[which(df_tot$Pdf>0),], aes(x=Bin, y=Pdf, group=Dataset, colour=Dataset)) + 
geom_point(aes(color=Dataset), alpha = 0.7, size=1.5) 

回答

2

预计算这些值并单独绘制它们看起来像是最简单的选项。与dplyr这样做需要最小的努力:

library(dplyr) 
q.95 <- df_tot %>% 
    group_by(Dataset) %>% 
    summarise(Bin_q.95 = quantile(Bin, 0.95)) 

ggplot(data=df_tot[which(df_tot$Pdf>0),], 
     aes(x=Bin, y=Pdf, group=Dataset, colour=Dataset)) + 
    geom_point(aes(color=Dataset), alpha = 0.7, size=1.5) + 
    geom_vline(data = q.95, aes(xintercept = Bin_q.95, colour = Dataset)) 

enter image description here

+0

该地块宾寿的95位数。例如,在上面的图中,红色数据集从0到100,因此无论密度如何,第95个分位数都是95。也就是'分位数(c(0:100),0.95)'。蓝色的一样。不幸的是,在直方图编程之前,我无法访问整个数据,因为它太大而不适合内存。这就是为什么我需要使用直方图。对于文件的每一层,我创建一个直方图。然后我用'HistogramTools :: AddHistrograms'在一个直方图中合并它们。 – AF7 2014-11-24 12:55:25

+0

这只是一个演示。其背后的想法是,你必须提前计算分位数并从一个单独的数据框中绘制它们。我不知道如何正确计算这些数据,似乎你的数据相当复杂。如果你的问题主要是关于如何计算分位数据的分位数(而不是关于如何使用'geom_vline'),请告诉我,我将删除答案。 – tonytonov 2014-11-24 13:18:47

+0

无需删除。我已经知道如何对分箱数据集进行分位,我可以使用ApproxQuantile()。实际上,我会将您的答案标记为接受,因为它会将我推向正确的方向,即在创建数据框之前保存分位数,然后创建数据框并使用geom_vline对其进行绘图。我有这方面的想法,但我不能专注。 – AF7 2014-11-24 13:44:08