[英]Adding an exponential geom_smooth in ggplot2 / R
我正在嘗試使用ggplot2生成一些示例圖形,我選擇的一個示例是生日問題 ,這里使用來自Oscon的Revolution 計算演示文稿中的“借用”代碼。
birthday<-function(n){
ntests<-1000
pop<-1:365
anydup<-function(i){
any(duplicated(sample(pop,n,replace=TRUE)))
}
sum(sapply(seq(ntests), anydup))/ntests
}
x<-data.frame(x=rep(1:100, each=5))
x<-ddply(x, .(x), function(df) {return(data.frame(x=df$x, prob=birthday(df$x)))})
birthdayplot<-ggplot(x, aes(x, prob))+
geom_point()+geom_smooth()+
theme_bw()+
opts(title = "Probability that at least two people share a birthday in a random group")+
labs(x="Size of Group", y="Probability")
在這里,我的圖形是我所描述的指數,但geom_smooth特別不適合數據。 我嘗試過黃土方法,但這並沒有改變很多東西。 任何人都可以建議如何添加更好的順利?
謝謝
保羅。
平滑程序對x
低值的突然變化沒有足夠快的反應(並且它無法知道prob
的值被限制在0-1范圍內)。 由於您具有如此低的可變性,因此快速解決方案是減少每個點平滑處理的值的范圍。 看看這個圖中的紅線:
birthdayplot + geom_smooth(span=0.1, colour="red")
問題是概率遵循邏輯曲線。 如果更改生日函數以返回原始成功和失敗而不是概率,則可以使用適當的平滑線。
birthday<-function(n){
ntests<-1000
pop<-1:365
anydup<-function(i){
any(duplicated(sample(pop,n,replace=TRUE)))
}
data.frame(Dups = sapply(seq(ntests), anydup) * 1, n = n)
}
x<-ddply(x, .(x),function(df) birthday(df$x))
現在,您必須將點添加為摘要,並將邏輯回歸指定為平滑類型。
ggplot(x, aes(n, Dups)) +
stat_summary(fun.y = mean, geom = "point") +
stat_smooth(method = "glm", family = binomial)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.