Ggplot 2を使用して、ヒストグラムに通常の曲線を重ねようとしています。
私の式:
_data <- read.csv (path...)
ggplot(data, aes(V2)) +
geom_histogram(alpha=0.3, fill='white', colour='black', binwidth=.04)
_
私はいくつかのことを試しました:
_+ stat_function(fun=dnorm)
_
....何も変更しなかった
_+ stat_density(geom = "line", colour = "red")
_
... x軸上に赤い直線を与えました。
_+ geom_density()
_
周波数値をy軸に維持し、密度値を必要としないため、私にとってはうまくいきません。
助言がありますか?
ヒントを事前に感謝します!
解決策が見つかりました!
+geom_density(aes(y=0.045*..count..), colour="black", adjust=4)
これは here および部分的に here と回答されました。
Y軸に頻度カウントを持たせる場合、観測値とビン幅に応じて標準曲線をスケーリングする必要があります。
# Simulate some data. Individuals' heights in cm.
n <- 1000
mean <- 165
sd <- 6.6
binwidth <- 2
height <- rnorm(n, mean, sd)
qplot(height, geom = "histogram", breaks = seq(130, 200, binwidth),
colour = I("black"), fill = I("white"),
xlab = "Height (cm)", ylab = "Count") +
# Create normal curve, adjusting for number of observations and binwidth
stat_function(
fun = function(x, mean, sd, n, bw){
dnorm(x = x, mean = mean, sd = sd) * n * bw
},
args = c(mean = mean, sd = sd, n = n, bw = binwidth))
編集
または、ファセットの使用を可能にし、リストされているアプローチ here を使用するより柔軟なアプローチのために、通常の曲線のデータを含む別のデータセットを作成し、これらをオーバーレイします。
library(plyr)
dd <- data.frame(
predicted = rnorm(720, mean = 2, sd = 2),
state = rep(c("A", "B", "C"), each = 240)
)
binwidth <- 0.5
grid <- with(dd, seq(min(predicted), max(predicted), length = 100))
normaldens <- ddply(dd, "state", function(df) {
data.frame(
predicted = grid,
normal_curve = dnorm(grid, mean(df$predicted), sd(df$predicted)) * length(df$predicted) * binwidth
)
})
ggplot(dd, aes(predicted)) +
geom_histogram(breaks = seq(-3,10, binwidth), colour = "black", fill = "white") +
geom_line(aes(y = normal_curve), data = normaldens, colour = "red") +
facet_wrap(~ state)
これは、JWillimanの回答に対する拡張コメントです。 Jの答えは非常に便利だと思いました。遊んでいるうちに、コードを単純化する方法を発見しました。私はそれがより良い方法だと言っているわけではありませんが、私はそれを言及すると思った。
JWillimanの答えは、y軸のカウントと、対応する密度正規近似をスケーリングするための「ハック」を提供することに注意してください(そうでなければ、1の総面積をカバーするため、ピークがはるかに低くなります)。
このコメントの要点:必要なパラメーターを美的機能に渡すことで、_stat_function
_内のより単純な構文、例えば.
aes(x = x, mean = 0, sd = 1, binwidth = 0.3, n = 1000)
これにより、_args =
_を_stat_function
_に渡す必要がなくなるため、より使いやすくなります。さて、それほど違いはありませんが、誰かが面白いと思うことを願っています。
_# parameters that will be passed to ``stat_function``
n = 1000
mean = 0
sd = 1
binwidth = 0.3 # passed to geom_histogram and stat_function
set.seed(1)
df <- data.frame(x = rnorm(n, mean, sd))
ggplot(df, aes(x = x, mean = mean, sd = sd, binwidth = binwidth, n = n)) +
theme_bw() +
geom_histogram(binwidth = binwidth,
colour = "white", fill = "cornflowerblue", size = 0.1) +
stat_function(fun = function(x) dnorm(x, mean = mean, sd = sd) * n * binwidth,
color = "darkred", size = 1)
_
このコードはそれを行う必要があります:
set.seed(1)
z <- rnorm(1000)
qplot(z, geom = "blank") +
geom_histogram(aes(y = ..density..)) +
stat_density(geom = "line", aes(colour = "bla")) +
stat_function(fun = dnorm, aes(x = z, colour = "blabla")) +
scale_colour_manual(name = "", values = c("red", "green"),
breaks = c("bla", "blabla"),
labels = c("kernel_est", "norm_curv")) +
theme(legend.position = "bottom", legend.direction = "horizontal")
注:qplotを使用しましたが、より汎用性の高いggplotを使用できます。