我目前中的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