我目前中的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)
该地块宾寿的95位数。例如,在上面的图中,红色数据集从0到100,因此无论密度如何,第95个分位数都是95。也就是'分位数(c(0:100),0.95)'。蓝色的一样。不幸的是,在直方图编程之前,我无法访问整个数据,因为它太大而不适合内存。这就是为什么我需要使用直方图。对于文件的每一层,我创建一个直方图。然后我用'HistogramTools :: AddHistrograms'在一个直方图中合并它们。 – AF7 2014-11-24 12:55:25
这只是一个演示。其背后的想法是,你必须提前计算分位数并从一个单独的数据框中绘制它们。我不知道如何正确计算这些数据,似乎你的数据相当复杂。如果你的问题主要是关于如何计算分位数据的分位数(而不是关于如何使用'geom_vline'),请告诉我,我将删除答案。 – tonytonov 2014-11-24 13:18:47
无需删除。我已经知道如何对分箱数据集进行分位,我可以使用ApproxQuantile()。实际上,我会将您的答案标记为接受,因为它会将我推向正确的方向,即在创建数据框之前保存分位数,然后创建数据框并使用geom_vline对其进行绘图。我有这方面的想法,但我不能专注。 – AF7 2014-11-24 13:44:08