2014-05-13 12 views
3

我試圖用小平面內的ggplot繪製數據的分佈/密度。這裏是我現在所在的地方,紅線顯示每個方面顯示的平均值。現在在這裏,平均值是沒有意義的,我希望有類似的繪圖,密度的峯值用xintercept和文本顯示。
enter image description here我用於機構的代碼是這樣的:使用R表示在各個小平面上的主峯高度

data <- read.table("sample.csv", header=F, sep=',') 
colnames(data) <- c("frame", "val") 
attach(data) 
library(ggplot2) 
library(grid) 

library(plyr) 
xdat <- ddply(data,"frame", transform, val_mean = signif(mean(val),3), med.x = signif(mean(val),3), med.y=signif(mean(density(val)$y),3)) 

ppi <- 500 
png("sample.png", width=4*ppi, height=4*ppi, res=ppi) 

hp <-ggplot(data=data, aes(x=val))+ 
geom_density() + 
geom_vline(aes(xintercept=val_mean),xdat, color="red",linetype="dashed",size=1) + 
theme_bw() 

hp<-hp + facet_wrap (~ frame, ncol=2, scales="free_y") + 
geom_text(data = xdat, aes(x=med.x,y=med.y,label=val_mean)) 

print(hp) 
dev.off() 

,並用於繪製此圖中的數據是:

data <- data.frame(
    "frame"=c(rep("A",9), rep("B", 13), rep("C", 7)), 
    "val"=c(1, rep(2,4), 4, 5, 6, rep(1,6), 2, rep(3,7), 1, rep(4,6)) 
    ) 

我知道已經有一些帖子,其中R已使用找到值中的峯值。但我希望繪製密度峯值,我無法找到任何解決方案(或者我錯過了它)。是否有可能在R中快速計算峯值並在不同的方面繪圖? 非常感謝您的時間和幫助!

+0

我不知道的方式從ggplot內做到這一點上的蒼蠅,但[這](http://stackoverflow.com/a/3614065/324364)答案應該指向正確的方向。 – joran

回答

11

我假設你想識別每個方面的單個最大峯 - 這將是分佈的模式。如果你的分佈是多模式的,我的答案只能確定最大的峯值。 This answer to another question解釋說geom_density()使用帶默認參數的density()函數。

話雖這麼說,下面的代碼應該爲你工作:

library(ggplot2) 
library(grid) 
library(plyr) 

data <- data.frame("frame"=c(rep("A",9), rep("B", 13), rep("C", 7)), "val"=c(1,rep(2,4),4,5,6,rep(1,6),2,rep(3,7),1,rep(4,6))) 
attach(data) 

densMode <- function(x){ 
    td <- density(x) 
    maxDens <- which.max(td$y) 
    list(x=td$x[maxDens], y=td$y[maxDens]) 
} 
xdat <- ddply(data,"frame", transform, val_mean = signif(densMode(val)$x,3), med.x = signif(densMode(val)$x,3), med.y=signif(densMode(val)$y,3)) 

hp <- ggplot(data=data, aes(x=val)) + 
    geom_density() + 
    geom_vline(aes(xintercept=val_mean),xdat, color="red",linetype="dashed",size=1) + 
    theme_bw() 

hp<- hp + 
    facet_wrap (~ frame, ncol=2, scales="free_y") + 
    geom_text(data = xdat, aes(x=med.x,y=med.y,label=val_mean)) 

hp 

唯一的線我改變是那些確定的圖是如何創建的(我沒有用png()),插入densMode()功能,並在xdat的定義中使用densMode()。我還根據您的示例數據創建了一個data.frame(爲了方便其他人可能想要回答的問題,我已將其作爲編輯提交給您的問題)。

的代碼產生如下圖所示: enter image description here

+0

謝謝@rbatt。 – user1777527

+0

@ user1777527不客氣!如果您發現答案有幫助,請考慮[upvoting或甚至接受](http://stackoverflow.com/help/privileges/vote-up)它! :) – rbatt