2017-08-17 43 views
2

我想將此函數曲線添加到直方圖。單獨地,他們工作。但是,當我嘗試將它們放在同一個圖上時,函數會混淆......我似乎無法弄清楚如何將它們放在一起。R ggplot2將函數添加到直方圖

# 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) 

曲線本身

curve by itself;

柱狀圖和曲線一起

histogram and curve together

+1

爲了讓你的例子工作,我使用了'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, β= 0.5,γ= 0.5)(β-α)/((x +β)^(α+ 1)*γ(α)) }。 (我重命名了數據'cc',因爲'c'已經是最常用函數的名字了)。通過這些更改使其運行,圖表看起來很好。如果仍有問題,請編輯代碼,以便可以複製問題。目前我投票結束爲「錯字/不可重現」。 – Gregor

+0

我的猜測是,你改變了一個(至少)你定義的'alpha','beta'或'gamma'的地方。這就是爲什麼將函數參數作爲參數對待而不是讓他們在全球環境中尋找值的良好習慣。 – Gregor

回答

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) 

enter image description here

0

感謝您的幫助!我最終找出了問題......這是因爲我的x值有一些大的值(大於100),當我刪除這些點時,圖看起來好多了!

但現在我的圖表看起來是這樣的:

graph without a smooth curve

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但無濟於事......

+0

沒關係,我想了一遍....我需要添加參數'n = 10000'到我的stat_function! – user8480288