ggplot2:用geom_col()覆盖stat_function()

时间:2019-07-30 14:24:19

标签: r ggplot2

执行以下代码时,输​​出图将显示f(x) = 0的蓝线,而不是Gamma pdf(请参阅此picture中的蓝线)。

analyzeGamma <- function(csvPath, alpha, beta) {
  dfSamples <- read.csv(file = csvPath,
                        header = TRUE,
                        sep = ",")
  base <- ggplot(dfSamples, aes(x = value, y = quantity))
  base + 
    geom_col(color = "red") +
    geom_vline(xintercept = qgamma(seq(0.1, 0.9, by = 0.1), alpha, beta)) +
    stat_function(
      fun = dgamma,
      args = list(shape = alpha, rate = beta),
      colour = "blue"
    )
}

path = "/tmp/data.csv"
alpha = 1.2
beta = 0.01

analyzeGamma(path, alpha, beta)

当我注释掉该行时:

geom_col(color = "red") +

here所示,正确绘制了Gamma pdf。

有什么想法为什么会发生以及如何解决?

谢谢。

2 个答案:

答案 0 :(得分:1)

这是因为您的geom_col()上升到25,并且概率密度函数的整数为1。如果我正确地假设您的列类似于带有quantities的计数数据的直方图,那您将调整密度以匹配列,如下所示:

密度*样本数量*列宽

如果您已预先计算了列,则“样本数”将是您所有y值的总和。

关于一些玩具数据的示例,请注意统计信息中的功能:

alpha = 1.2
beta = 0.01

df <- data.frame(x = rgamma(1000, shape = alpha, rate = beta))

binwidth <- 5

ggplot(df, aes(x)) +
  geom_histogram(binwidth = binwidth) +
  stat_function(
    fun = function(z, shape, rate)(dgamma(z, shape, rate) * length(df$x) * binwidth),
    args = list(shape = alpha, rate = beta),
    colour = "blue"
  )

enter image description here

以下带有geom_col()的示例给出了相同的图片:

x <- table(cut_width(df$x, binwidth, boundary = 0))
newdf <- data.frame(x = seq(0.5*binwidth, max(df$x), by = binwidth),
                    y = as.numeric(x))

ggplot(newdf, aes(x, y)) +
  geom_col(width = binwidth) +
  stat_function(
    fun = function(z, shape, rate)(dgamma(z, shape, rate) * sum(newdf$y) * binwidth),
    args = list(shape = alpha, rate = beta),
    colour = "blue"
  )

答案 1 :(得分:0)

ggplot缩放y轴以显示所有数据。蓝色曲线显示为一条正比例缩放的直线-如果您在两个图表中都比较y轴的比例,则会看到:当您绘制geom_col时,y轴最大值在25处(和stat_functions似乎是一条直线)。如果没有geom_col,则y轴最大值为0.006。