亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在R的ggplot2中一起使用stat_function和facet_wrap

在R的ggplot2中一起使用stat_function和facet_wrap

千萬里不及你 2019-11-13 13:38:30
我正在嘗試使用ggplot2繪制晶格類型數據,然后在樣本數據上疊加正態分布以說明基礎數據離正態有多遠。我想讓普通dist位于頂部,以具有與面板相同的均值和stdev。這是一個例子:library(ggplot2)#make some example datadd<-data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24)))colnames(dd) <- c("x_value", "Predicted_value",  "State_CD")#This workspg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) +  facet_wrap(~State_CD)print(pg)一切都很好,并產生了一個很好的數據三面板圖。如何在頂部添加法線dist?看來我會使用stat_function,但是失敗了:#this failspg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + stat_function(fun=dnorm) +  facet_wrap(~State_CD)print(pg)似乎stat_function與facet_wrap功能不兼容。我怎樣才能使這兩個打得更好?- - - - - - 編輯 - - - - -我嘗試從以下兩個答案中整合想法,但我仍然不存在:使用兩個答案的組合,我可以一起破解:library(ggplot)library(plyr)#make some example datadd<-data.frame(matrix(rnorm(108, mean=2, sd=2),36,2),c(rep("A",24),rep("B",24),rep("C",24)))colnames(dd) <- c("x_value", "Predicted_value",  "State_CD")DevMeanSt <- ddply(dd, c("State_CD"), function(df)mean(df$Predicted_value)) colnames(DevMeanSt) <- c("State_CD", "mean")DevSdSt <- ddply(dd, c("State_CD"), function(df)sd(df$Predicted_value) )colnames(DevSdSt) <- c("State_CD", "sd")DevStatsSt <- merge(DevMeanSt, DevSdSt)pg <- ggplot(dd, aes(x=Predicted_value))pg <- pg + geom_density()pg <- pg + stat_function(fun=dnorm, colour='red', args=list(mean=DevStatsSt$mean, sd=DevStatsSt$sd))pg <- pg + facet_wrap(~State_CD)print(pg)這真的很近...除了正常的dist繪圖有問題之外:在此處輸入圖片說明我在這里做錯了什么?
查看完整描述

3 回答

?
慕工程0101907

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) 


查看完整回答
反對 回復 2019-11-13
?
冉冉說

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參數。讀者可以練習獲得面板特定的平均值和標準偏差*;)


'*'換句話說,不確定如何完成...


查看完整回答
反對 回復 2019-11-13
?
皈依舞

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)


查看完整回答
反對 回復 2019-11-13
  • 3 回答
  • 0 關注
  • 2482 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號