【问题标题】:R ggplot2 adding function to a histogramR ggplot2将函数添加到直方图
【发布时间】:2017-08-17 20:24:10
【问题描述】:

我正在尝试将此函数曲线添加到直方图中。单独地,他们工作。但是当我尝试将它们放在同一张图上时,函数就搞砸了……我似乎无法弄清楚如何将它们放在一起。

# make dataframe for ggplot (can use random numbers from 0 to 10 to simulate x)
c= data.frame(x= x, cx= c(seq(from= 0.001, to= 10, by= 0.001)))

x 和 cx 具有相同数量的数据点。

# function for curve (alpha and beta are just constants set at 0.5)
fx= function(x){
    (beta^alpha)/((x+beta)^(alpha+1)*gamma(alpha))
}

当 geom_histogram 或 stat_function 被注释掉时,图表可以正常工作。

# graph code
h_x= ggplot(data= NULL) +
    geom_histogram(data= c, aes(x= x, y= ..density..), binwidth= 0.2, col= "purple", fill= "yellow") +
    stat_function(fun= fx, data= c, aes(x= cx)) +
    coord_cartesian(xlim= c(0:10)) +
    labs(title= "Figure 03", x= "x")
plot(h_x)

曲线本身

;

直方图和曲线在一起

【问题讨论】:

  • 为了让您的示例工作,我使用了set.seed(47); cc = data.frame(x= runif(10000, 0, 10), cx = c(seq(from= 0.001, to= 10, by= 0.001)))fx = function(x, alpha = 0.5, beta = 0.5, gamma = 0.5){ (beta^alpha)/((x+beta)^(alpha+1)*gamma(alpha)) }。 (我将数据重命名为cc,因为c已经是最常用函数的名称了)。通过这些更改使其运行,图表看起来很好。如果仍有问题,请编辑代码以便重现问题。现在我投票以“拼写错误/不可重现”结束。
  • 我的猜测是,您在某个地方(至少)更改了 alphabetagamma 的定义之一。这就是为什么将函数参数视为参数而不是让它们在全局环境中寻找值是一种很好的做法的原因。

标签: r ggplot2 statistics


【解决方案1】:

像 @Gregor 一样,我对您的代码进行了一些更改,图表看起来还不错。
希望对你有帮助。

set.seed(1)
x <- rgamma(10000,1)
df1 <- data.frame(x= x, cx= c(seq(from= 0.001, to= 10, by= 0.001)))

beta <- alpha <- 0.5
fx <- function(x) {
    print(str(x))
    (beta^alpha)/((x+beta)^(alpha+1)*gamma(alpha))
}

# graph code
h_x <- ggplot(data=df1) +
    geom_histogram(aes(x= x, y= ..density..), binwidth= 0.2, col= "purple", fill= "yellow") +
    stat_function(fun=fx, aes(x=cx), lwd=1) +
    coord_cartesian(xlim= c(0:10)) +
    labs(title= "Figure 03", x="x")
plot(h_x)

【讨论】:

    【解决方案2】:

    感谢您的帮助!我最终找出了问题...这是因为我的 x 值有一些较大的值(大于 100),当我删除这些点时,图表看起来好多了!

    但现在我的图表看起来像这样:

    n= 10000
     i= 1
     alpha= 0.5
     beta= 0.5
     x= matrix(data= 5, nrow= n)
     lambda= matrix(data= 1.5, nrow= n)
    
     while (i < n) {
       x[i+1]= rexp(1, rate= lambda[i])
       lambda[i+1]= (x[i+1]+beta)^(alpha+1)*(lambda[i]^alpha)*exp(-lambda[i]*(x[i+1]+beta))
    
    if ((lambda[i+1] < 0.00001) || (lambda[i+1] > 10)) {
      while ((lambda[i+1] < 0.00001) || (lambda[i+1] > 10)) {
        x[i+1]= rexp(1, rate= lambda[i])
        lambda[i+1]= (x[i+1]+beta)^(alpha+1)*(lambda[i]^alpha)*exp(-lambda[i]*(x[i+1]+beta))
      }
    }
    i= i+1
    }
    
    # data frame:
    df4= data.frame(x= x[x<100], cx= c(seq(from= 0.011, to= 10, by= 0.001)))  
    
    # graph (same function (fx) from first post):
    h_x= ggplot(data= df4) +
        geom_histogram(aes(x= x, y= ..density..), binwidth= 0.2, col= "purple", fill= "yellow") +
        stat_function(fun= fx) +
        coord_cartesian(xlim= c(0:10)) +
        labs(title= "Figure 03", x= "x")
      plot(h_x)
    

    有什么方法可以让它变成平滑的曲线吗?我尝试了 scale_x_continuous 但无济于事......

    【讨论】:

    • 没关系,我又想通了……我需要将参数“n=10000”添加到我的 stat_function!
    猜你喜欢
    • 2019-08-04
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多