【问题标题】:Draw vertical quantile lines over histogram在直方图上绘制垂直分位数线
【发布时间】:2015-01-22 02:47:24
【问题描述】:

我目前在 R 中使用 ggplot 生成以下图:

数据存储在一个包含三列的数据框中:PDF(上图中的 y 轴)、mids(x) 和数据集名称。这是从直方图创建的。
我想要做的是为代表第 95 个分位数的每个数据集绘制一条颜色编码的垂直线,就像我在下面手动绘制的示例一样:

我尝试使用+ geom_line(stat="vline", xintercept="mean"),但当然我正在寻找分位数,而不是平均值,AFAIK ggplot 不允许这样做。颜色很好。
我也试过+ stat_quantile(quantiles = 0.95),但我不确定它到底做了什么。文档非常稀缺。颜色也很好。

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

我了解计算直方图的分位数与计算数字列表的分位数并不完全相同。我不知道它会有什么帮助,但HistogramToolspackage 包含一个用于直方图分位数的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)

【问题讨论】:

    标签: r ggplot2 quantile


    【解决方案1】:

    预先计算这些值并分别绘制它们似乎是最简单的选择。使用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))
    

    【讨论】:

    • 这绘制了 Bin tho 的第 95 个分位数。例如,在上图中,红色数据集从 0 变为 100,因此第 95 个分位数就是 95,无论密度是多少。即quantile(c(0:100), 0.95)。蓝色的也一样。不幸的是,在制作直方图之前,我无法访问整个数据数组,因为它太大而无法放入内存。这就是为什么我需要使用直方图。对于文件的每一层,我创建一个直方图。然后我将它们与HistogramTools::AddHistrograms 合并到一个直方图中。
    • 这只是一个演示。它背后的想法是您必须提前计算分位数并从单独的数据框中绘制它们。我不知道如何正确计算这些,看来您的数据相当复杂。如果您的问题本质上是关于如何计算分箱数据的分位数(而不是关于如何使用 geom_vline),请告诉我,我将删除答案。
    • 无需删除。我已经知道如何对分箱数据集进行分位数,我可以使用 ApproxQuantile()。实际上,我会将您的答案标记为已接受,因为它使我朝着正确的方向前进,即在创建数据框之前保存分位数,然后使用它们创建数据框并使用 geom_vline 绘制它。我有类似的想法,但我不太能集中注意力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多