3 回答

TA貢獻1887條經驗 獲得超5個贊
stat_function旨在在每個面板中覆蓋相同的功能。(沒有明顯的方法可以使函數的參數與不同的面板匹配)。
正如伊恩(Ian)所建議的那樣,最好的方法是自己生成法線,并將其繪制為單獨的數據集(這是您之前出錯的地方-合并對于這個示例來說沒有意義,如果仔細看,您會看到這就是為什么您會得到奇怪的鋸齒圖案)。
解決問題的方法如下:
dd <- data.frame(
predicted = rnorm(72, mean = 2, sd = 2),
state = rep(c("A", "B", "C"), each = 24)
)
grid <- with(dd, seq(min(predicted), max(predicted), length = 100))
normaldens <- ddply(dd, "state", function(df) {
data.frame(
predicted = grid,
density = dnorm(grid, mean(df$predicted), sd(df$predicted))
)
})
ggplot(dd, aes(predicted)) +
geom_density() +
geom_line(aes(y = density), data = normaldens, colour = "red") +
facet_wrap(~ state)

TA貢獻1877條經驗 獲得超1個贊
我認為您需要提供更多信息。這似乎可行:
pg <- ggplot(dd, aes(Predicted_value)) ## need aesthetics in the ggplot
pg <- pg + geom_density()
## gotta provide the arguments of the dnorm
pg <- pg + stat_function(fun=dnorm, colour='red',
args=list(mean=mean(dd$Predicted_value), sd=sd(dd$Predicted_value)))
## wrap it!
pg <- pg + facet_wrap(~State_CD)
pg
我們為每個面板提供相同的均值和sd參數。讀者可以練習獲得面板特定的平均值和標準偏差*;)
'*'換句話說,不確定如何完成...

TA貢獻1851條經驗 獲得超3個贊
如果您不想“手工”生成正態分布線圖,仍要使用stat_function并排顯示圖形-那么您可以考慮使用在“ Cookbook for R”上發布的“ multiplot”函數替代facet_wrap。您可以從此處將多圖代碼復制到您的項目中。
復制代碼后,請執行以下操作:
# Some fake data (copied from hadley's answer)
dd <- data.frame(
predicted = rnorm(72, mean = 2, sd = 2),
state = rep(c("A", "B", "C"), each = 24)
)
# Split the data by state, apply a function on each member that converts it into a
# plot object, and return the result as a vector.
plots <- lapply(split(dd,dd$state),FUN=function(state_slice){
# The code here is the plot code generation. You can do anything you would
# normally do for a single plot, such as calling stat_function, and you do this
# one slice at a time.
ggplot(state_slice, aes(predicted)) +
geom_density() +
stat_function(fun=dnorm,
args=list(mean=mean(state_slice$predicted),
sd=sd(state_slice$predicted)),
color="red")
})
# Finally, present the plots on 3 columns.
multiplot(plotlist = plots, cols=3)
- 3 回答
- 0 關注
- 2482 瀏覽
添加回答
舉報