2014-11-24 111 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