2014-10-09 2 views
3

하나의 플롯 내에서 (facet_wrap을 사용하여) 여러 개의 히스토그램을 만들고 싶습니다. ("P1"P2는 ")의 10 개 쓰레기통을 가정 해 봅시다 나는 그것이 매개 변수 당 생성 플롯을 수정하고 싶습니다 지금ggplot2 히스토그램 binwidth

df <- data.frame(p1 = rnorm(100,5,2), p2 = rnorm(100,80,20), group = rep(LETTERS[1:4],25)) 

library(ggplot2) 
library(reshape) 

plotData <- melt(df, id.vars = "group", measure.vars = c("p1","p2") ) 

m <- ggplot(plotData, aes(x = value, color = group, fill = group, group = group)) 
m <- m + geom_bar(position=position_dodge()) 
m <- m + facet_wrap(~ variable,scales = "free_x") 
print(m) 

까지

지금 : 이 제품은 예제 코드가 될 수있다. 나는 데이터의 하위 집합에 의존해야이 같은 binwidth/휴식 계산을 할 수있는 방법을 찾을 수 없습니다.

그것이 가능 전혀 내 솔루션을 공유하고 싶어?


수를 막대 그래프 배율을 조정 밀도 곡선과 막대 그래프 오버레이 할 수있는 가능성 확장 (위의 링크 된 대답 질문에서 가져온) :

df <- data.frame(p1 = rnorm(1000,5,2), p2 = rnorm(1000,80,20), group = rep(LETTERS[1:4],25)) 

library(ggplot2) 
library(reshape) 
library(plyr) 

plotData <- melt(df, id.vars = "group", measure.vars = c("p1","p2") ) 

nBins <- 10 

groupedData <- dlply(plotData, .(variable)) 
groupedBinWidth <- llply(groupedData, .fun = function(data, nBins) { 
    r <- range(data$value, na.rm = TRUE, finite = TRUE) 
    widthOfBins = (r[2] - r[1])/nBins 
    if (is.na(widthOfBins) || is.infinite(widthOfBins) || (widthOfBins <= 0)) widthOfBins <- NULL 
    widthOfBins 
}, nBins = nBins) 

densData <- dlply(plotData, .(variable, group), .fun = function(subData){ 
    param <- subData$variable[1] 
    group <- subData$group[1] 
    d <- density(subData$value) 
    bw <- groupedBinWidth[[param]] 
    data.frame(x = d$x, y = d$y * nrow(subData) * bw , group = group, variable = param) 
}) 

hls <- mapply(function(x, b) geom_bar(aes(x = value), position = position_dodge(), data = x, binwidth = b), 
       groupedData, groupedBinWidth) 

dLay <- mapply(function(data) geom_density(data = data, aes(x = x, y = y), stat = "identity", fill = NA, size = 1), 
       densData) 

m <- ggplot(plotData, aes(x = value, color = group, fill = group, group = group)) 
m <- m + hls 
m <- m + dLay 
m <- m + facet_wrap(~ variable,scales = "free") 
print(m) 

enter image description here

+0

그래서 당신은 각 그룹 /면 10 개 쓰레기통에, 히스토그램 원하는, 또는 당신을 오해는 무엇입니까? – fileunderwater

+0

@fileunderwater : 맞습니다, 그게 내가 원하는 것입니다. – July

+0

@shadow : 나는이 질문을 보지 못했습니다. 링크에 감사드립니다. 답변이 포함되어있을 수 있습니다. 나는 그것을 줄 것이다 – July

답변

0

이 시도 - 정말 추한 코드를,하지만 난 당신을 이해한다면 작동 바르게. geom_density로 재생하고 더 읽기 쉽도록 채우기를 제거하려고 할 수 있습니다.

nbin<- 5 
m <- ggplot(plotData, aes(x = value, color = group, fill = group, group = group)) 
m <- m + geom_histogram(data = subset(plotData, variable == "p1"), binwidth=diff(range(subset(plotData, variable == "p1")$value))/nbin) 
m <- m + geom_histogram(data = subset(plotData, variable == "p2"), binwidth=diff(range(subset(plotData, variable == "p2")$value))/nbin) 
m <- m + facet_wrap(~ variable,scales = "free_x") 
print(m) 

enter image description here

+0

이것은 예제 코드에서 작동하지만 매개 변수 (p1을 알 수없는 번호에 사용할 수 있도록해야합니다. , p2, ... pn) – July

+0

@July 나는 히스토그램/함수 호출을 부분적으로 만들려고 노력해야한다. 아마도 mapply를 사용했을 것이다. – fileunderwater