2014-10-09 198 views
3

我想創建多個直方圖在一個繪圖(使用facet_wrap)。 這可能是一個示例代碼: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) 

現在,我想修改它每參數創建情節(「P1」,P2" )讓我們說10檔

截至目前,。我無法找到一個方法來做到這一點作爲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 2014-10-09 11:52:27

+0

@fileunderwater:正確,那就是我想要的 – July 2014-10-09 11:58:49

+0

@shadow:我沒有看到這個問題;感謝鏈接,它可能包含答案;我會給它一個看看 – July 2014-10-09 11:59:13

回答

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 2014-10-09 13:05:41

+0

@七月我想你應該嘗試從一個函數做直方圖/子集調用,然後,也許使用mapply。 – fileunderwater 2014-10-09 13:28:47