2014-05-13 4 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 questiongeom_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 

유일한 라인은 내가 변화 그래프가 densMode() 기능을 삽입 (I가 png()을 사용하지 않은) 작성하는 방법을 결정하는 사람이었다 xdat의 정의에 densMode()을 사용하는 것입니다. 귀하의 예제 데이터를 기반으로 data.frame을 만들었습니다. 저는 답변을 원할 수도있는 다른 사람들의 편의를 위해 질문에 대한 편집본으로 제출했습니다.

코드는 다음 그림이 생성 enter image description here

+0

@rbatt에게 감사드립니다. – user1777527

+0

@ user1777527 여러분을 환영합니다! 도움이되는 답변을 찾으면 [upvoting or accepting] (http://stackoverflow.com/help/privileges/vote-up)을 고려하십시오! :) – rbatt