web-dev-qa-db-ja.com

ggplot2を使用して正規曲線をヒストグラムにプロット:コードは0で直線を生成します

このフォーラムは、コードを作成する上ですでに多くの助けになっており、経験的な正規曲線でオーバーレイされた特定の変数のヒストグラムを返すことが期待されていました。 ggplot2とstat_functionを使用してコードを記述しました。残念ながら、コードは正しいヒストグラムでプロットを生成しましたが、正規曲線はゼロでの直線です(次のコードで生成されたプロットの赤い線)。

この最小限の例では、mtcarsデータセットを使用しました。元のデータセットでも、ggplotとstat_functionの同じ動作が観察されます。

これはコードが書かれて使用されているものです:

library(ggplot2)
mtcars
hist_staff <- ggplot(mtcars, aes(x = mtcars$mpg)) + 
  geom_histogram(binwidth = 2, colour = "black", aes(fill = ..count..)) +
  scale_fill_gradient("Count", low = "#DCDCDC", high = "#7C7C7C") +
  stat_function(fun = dnorm, colour = "red")
print(hist_staff)

また、dnormを指定しようとしました。

stat_function(fun = dnorm(mtcars$mpg, mean = mean(mtcars$mpg), sd = sd(mtcars$mpg))

それもうまくいきませんでした-引数が数値でないことを示すエラーメッセージが返されました。

皆さんが私を助けてくれることを願っています!よろしくお願いします!

最高、ジャニック

10
Jannik

曲線とヒストグラムは異なるyスケールであり、stat_functionのヘルプページをチェックしていません。そうでない場合は、例に明確に示されているように、引数をlistに配置します。また、最初のaes呼び出しでggplotを正しく実行していません。 SOでggplotを少しずつ学ぶのではなく、チュートリアルや本(または少なくともヘルプページ)を増やすことを心からお勧めします。

stat_functionargの問題とggplot``aesの問題を修正したら、y軸のスケールの違いに取り組む必要があります。これを行うには、ヒストグラムのyを切り替えて、基になるstat_bin計算データフレームの密度を使用する必要があります。

library(ggplot2)

gg <- ggplot(mtcars, aes(x=mpg))
gg <- gg + geom_histogram(binwidth=2, colour="black", 
                          aes(y=..density.., fill=..count..))
gg <- gg + scale_fill_gradient("Count", low="#DCDCDC", high="#7C7C7C")
gg <- gg + stat_function(fun=dnorm,
                         color="red",
                         args=list(mean=mean(mtcars$mpg), 
                                  sd=sd(mtcars$mpg)))

gg

enter image description here

21
hrbrmstr