質問

ggplot2 を使用して格子タイプのデータをプロットし、サンプル データに正規分布を重ねて、基礎となるデータが正規からどれだけ離れているかを示しようとしています。パネルと同じ平均値と標準偏差を持つように、通常の dist を上部に置きたいと考えています。

以下に例を示します。

library(ggplot2)

#make some example data
dd<-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 works
pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) +  facet_wrap(~State_CD)
print(pg)

これはすべてうまく機能し、データの素晴らしい 3 つのパネルのグラフが生成されます。通常の dist を一番上に追加するにはどうすればよいですか?stat_function を使用するようですが、これは失敗します。

#this fails
pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + stat_function(fun=dnorm) +  facet_wrap(~State_CD)
print(pg)

stat_function が facet_wrap 機能と連携していないようです。どうしたらこの二人が仲良く遊べるでしょうか?

- - - - - - 編集 - - - - -

以下の 2 つの回答からのアイデアを統合しようとしましたが、まだそこには達していません。

両方の答えを組み合わせて使用​​すると、次のようにハッキングできます。

library(ggplot)
library(plyr)

#make some example data
dd<-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 プロットに何か問題がある場合は次のとおりです。

enter image description here

私はここで何を間違っているのでしょうか?

役に立ちましたか?

解決

stat_functionは、すべてのパネルで同じ機能をオーバーレイするように設計されています。 (異なるパネルで関数のパラメータを一致する明白な方法はありません)。

としてイアンが示唆、最良の方法は、通常のカーブを自分で生成し、そして、それらをプロットすることであるの別々ののデータセット(これはあなたが前に間違って行っていた場所である - ちょうどのために意味をなさないマージこの例で、あなたが慎重に見れば、あなたは)奇妙な鋸歯状のパターンを取得している理由のが表示されます。

ここで私が問題を解決するに取り掛かるだろう方法は次のとおりです。

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) 

他のヒント

私は、あなたがより多くの情報を提供する必要があると思います。これが動作しているようです。

 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パラメータを提供しています。パネルの特定手段と標準偏差を取得する*読者に運動として残っている。)

つまり、

「*」、いないことを確認、それはどのように行うことができるか...

私はあなたの最善の策は、geom_lineを使って手動で線を引くことだと思います。

dd<-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")
dd$Predicted_value<-dd$Predicted_value*as.numeric(dd$State_CD) #make different by state

##Calculate means and standard deviations by level
means<-as.numeric(by(dd[,2],dd$State_CD,mean))
sds<-as.numeric(by(dd[,2],dd$State_CD,sd))

##Create evenly spaced evaluation points +/- 3 standard deviations away from the mean
dd$vals<-0
for(i in 1:length(levels(dd$State_CD))){
    dd$vals[dd$State_CD==levels(dd$State_CD)[i]]<-seq(from=means[i]-3*sds[i], 
                            to=means[i]+3*sds[i],
                            length.out=sum(dd$State_CD==levels(dd$State_CD)[i]))
}
##Create normal density points
dd$norm<-with(dd,dnorm(vals,means[as.numeric(State_CD)],
                        sds[as.numeric(State_CD)]))


pg <- ggplot(dd, aes(Predicted_value)) 
pg <- pg + geom_density() 
pg <- pg + geom_line(aes(x=vals,y=norm),colour="red") #Add in normal distribution
pg <- pg + facet_wrap(~State_CD,scales="free")
pg
あなたがggformulaを使用して喜んでいる場合は、

は、これは非常に簡単です。 (ミックスと一致することも可能であり、使用ggformulaだけ配布オーバーレイのために、私はggformulaアプローチにフルを示します。)

library(ggformula)
theme_set(theme_bw())

gf_dens( ~ Sepal.Length | Species, data = iris) %>%
  gf_fitdistr(color = "red") %>% 
  gf_fitdistr(dist = "gamma", color = "blue")

reprexパッケージの(v0.2.1)によって2019年1月15日に作成SUP>

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top