在 R 中使用 ggplot 绘制均匀分布
Drawing uniform Distributions with ggplot in R
我想在 R 中绘制不同的均匀分布,最好使用 ggplot。当尝试绘制 U(0.35,0.55) 的 pdf 时,看起来边缘周围有一些值(即参数值,在本例中为 0.35 和 0.55),其概率与应有的不同。输出可以在这里看到:
这在作为均匀分布输入的不同参数之间是一致的,似乎不是规模问题。
重现类似结果的代码示例:
#parameters
alpha_1 <- 0.35
beta_1 <- 0.55
alpha_2 <- 0.5
beta_2 <- 0.7
alpha_3 <- 0.1
beta_3 <- 0.3
base <- ggplot() + xlim(-1, 2)
base +
geom_function(aes(colour = "state 1"), fun = dunif, args = list(alpha_1, beta_1)) +
geom_function(aes(colour = "state 2"), fun = dunif, args = list(alpha_2, beta_2)) +
geom_function(aes(colour = "state 3"), fun = dunif, args = list(alpha_3, beta_3))
使用 stat_function 而不是 geom_function 不会改变任何东西。
但是,下面的工作:
curve(dunif(x, min = alpha_1, max = beta_1),
from = 0, to = 1,
n = 100000,
col = "blue",
lwd = 2,
add = F,
yaxt = "n",
ylab = 'probability')
curve(dunif(x, min = alpha_2, max = beta_2),
from = 0, to = 1,
n = 100000,
col = "red",
lwd = 2,
add = T,
yaxt = "n",
ylab = 'probability')
curve(dunif(x, min = alpha_3, max = beta_3),
from = 0, to = 1,
n = 100000,
col = "black",
lwd = 2,
add = T,
yaxt = "n",
ylab = 'probability')
我怎样才能让它在 ggplot 中工作?在我看来问题可能是这样的:
计算 x 轴上的 n 个值以获得图表的坐标。围绕参数 (a,b) 这些是,例如在 a+0.0001 和 a-0.0001。这些坐标之间的直线不会完全垂直。我不确定这是否是正确的诊断,但无论如何,我将不胜感激。谢谢!
这很容易通过增加评估点数来解决,正如 Gregor Thomas 在评论中指出的那样。以下调整后的代码按预期工作:
library(ggplot2)
#parameters
alpha_1 <- 0.35
beta_1 <- 0.55
alpha_2 <- 0.5
beta_2 <- 0.7
alpha_3 <- 0.1
beta_3 <- 0.3
base <- ggplot() + xlim(-1, 2)
base +
stat_function(aes(colour = "state 1"), fun = dunif, args = list(alpha_1, beta_1), n = 10001) +
stat_function(aes(colour = "state 2"), fun = dunif, args = list(alpha_2, beta_2), n = 10001) +
stat_function(aes(colour = "state 3"), fun = dunif, args = list(alpha_3, beta_3), n = 10001)
关键的变化是在每个 stat_function 调用中添加 n=10001
。
我想在 R 中绘制不同的均匀分布,最好使用 ggplot。当尝试绘制 U(0.35,0.55) 的 pdf 时,看起来边缘周围有一些值(即参数值,在本例中为 0.35 和 0.55),其概率与应有的不同。输出可以在这里看到:
这在作为均匀分布输入的不同参数之间是一致的,似乎不是规模问题。
重现类似结果的代码示例:
#parameters
alpha_1 <- 0.35
beta_1 <- 0.55
alpha_2 <- 0.5
beta_2 <- 0.7
alpha_3 <- 0.1
beta_3 <- 0.3
base <- ggplot() + xlim(-1, 2)
base +
geom_function(aes(colour = "state 1"), fun = dunif, args = list(alpha_1, beta_1)) +
geom_function(aes(colour = "state 2"), fun = dunif, args = list(alpha_2, beta_2)) +
geom_function(aes(colour = "state 3"), fun = dunif, args = list(alpha_3, beta_3))
使用 stat_function 而不是 geom_function 不会改变任何东西。
但是,下面的工作:
curve(dunif(x, min = alpha_1, max = beta_1),
from = 0, to = 1,
n = 100000,
col = "blue",
lwd = 2,
add = F,
yaxt = "n",
ylab = 'probability')
curve(dunif(x, min = alpha_2, max = beta_2),
from = 0, to = 1,
n = 100000,
col = "red",
lwd = 2,
add = T,
yaxt = "n",
ylab = 'probability')
curve(dunif(x, min = alpha_3, max = beta_3),
from = 0, to = 1,
n = 100000,
col = "black",
lwd = 2,
add = T,
yaxt = "n",
ylab = 'probability')
我怎样才能让它在 ggplot 中工作?在我看来问题可能是这样的:
计算 x 轴上的 n 个值以获得图表的坐标。围绕参数 (a,b) 这些是,例如在 a+0.0001 和 a-0.0001。这些坐标之间的直线不会完全垂直。我不确定这是否是正确的诊断,但无论如何,我将不胜感激。谢谢!
这很容易通过增加评估点数来解决,正如 Gregor Thomas 在评论中指出的那样。以下调整后的代码按预期工作:
library(ggplot2)
#parameters
alpha_1 <- 0.35
beta_1 <- 0.55
alpha_2 <- 0.5
beta_2 <- 0.7
alpha_3 <- 0.1
beta_3 <- 0.3
base <- ggplot() + xlim(-1, 2)
base +
stat_function(aes(colour = "state 1"), fun = dunif, args = list(alpha_1, beta_1), n = 10001) +
stat_function(aes(colour = "state 2"), fun = dunif, args = list(alpha_2, beta_2), n = 10001) +
stat_function(aes(colour = "state 3"), fun = dunif, args = list(alpha_3, beta_3), n = 10001)
关键的变化是在每个 stat_function 调用中添加 n=10001
。