繁体   English   中英

如何 plot 许多概率密度函数(pdf)没有锋利的边缘?

[英]How to plot many probability density functions (pdfs) without sharp edges?

我在绘制 ggplot2 中没有锐边的连续分布时遇到问题。 我需要在一个 plot 上显示其中两个。 此外,它不必是ggplot2 来实现此结果。

我知道,数据点的数量直接影响线条的平滑度,但这里并非如此。 您可以在下面看到一些示例数据(来自dput

 sample.data<-list(beta.data = structure(list(cluster = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), beta.density = c(0, 3.42273368363934e-43, 8.42987148403021e-29,    
2.04764468657484e-20, 1.69485562831516e-14, 6.07999638837842e-10, 2.88180370232676e-06, 0.00314064636750876, 0.954118897015866, 0, 0, 3.80101893822358e-36, 6.43342582657081e-22, 6.82956252277493e-14, 1.75291058931833e-08, 0.000131874335695378, 0.0750918340641428,     3.72532418759802, 5.05242078519544, 0), pr = c(0, 0.111111111111111, 0.222222222222222, 0.333333333333333, 0.444444444444444, 0.555555555555556, 0.666666666666667, 0.777777777777778,     0.888888888888889, 1, 0, 0.111111111111111, 0.222222222222222, 0.333333333333333, 0.444444444444444, 0.555555555555556, 0.666666666666667, 0.777777777777778, 0.888888888888889, 1)), row.names = c(NA, -20L), class = "data.frame"), beta.params = structure(list(cluster = 1:2, a = c(49, 50), b = c(2, 10), ni.beta = c(0.961,0.833), sd.beta = c(0.00072, 0.00228)), row.names = c(NA,-2L), class = "data.frame"))

在我使用 geom_col 之前,它会将值离散化。 我和geom_area一起去了:

ggplot(sample.data$beta.data, aes(x = pr, y = beta.density)) +
  geom_area(stat = "function",
            fun = dbeta, 
            args = list(shape1 = sample.data$beta.params[1,"a"], shape2 = sample.data$beta.params[1,"b"]),
            fill = "#F1C40F",
            colour = "black",
            alpha = 0.7) +
  geom_area(stat = "function",
            fun=dbeta, 
            args = list(shape1 = sample.data$beta.params[2,"a"], shape2 = sample.data$beta.params[2,"b"]),
            fill = "#3498DB",
            colour = "black",
            alpha = 0.7)

输出边缘锐利的图片

我给你展示了 10 个点的数据,但是 1000 个点看起来几乎一样。 情况并非如此,即使 100 分看起来也不错:

p = seq(0,1, length=100)
plot(p, dbeta(p, 50, 10), ylab="Density", type ="l", col=4, , lwd = 2)

在这里,我附上了代码来模拟数据。 哦,这些麻烦的 beta 参数是 a = 49 和 b = 2。

len <- 100
p <- seq(0,1, length.out = len)
df <- data.frame(rbind(cbind("cl" = rep(1, times = length(p)), "beta" = dbeta(p, 50, 10),"p"= p),
                       cbind("cl" = rep(1, times = length(p)), "beta" = dbeta(p, 40, 2),"p"= p)))

你有什么想法?

编辑: pdfs在这里代表概率密度函数。 这就是为什么我没有将“pdf”作为标签。 无论如何,当我尝试将图形打印到 PDF 文件时,我很抱歉造成混淆。 结果也很差(锋利的边缘),但它结束了。 没关系。 无论我做什么(合理地),我都希望看到流畅的线条。

EDIT2可以实现,因为:

library(mosaic)
theme_set(theme_bw())
xpbeta(c(0.7, 0.90), shape1 = 49, shape2 = 2)

它使用参数 (49, 2) 生成漂亮、平滑的 beta dist。 但话又说回来,我需要在一张图表中显示两个分布。

我找到了答案。 它仍然需要一些编辑(比如我无法弄清楚的透明度/alpha),但总的来说,这就是我的意思。 代码:

library(mosaic)
plotDist('beta', params=list(49,2), kind='density', type = "h", col = "#3498DB", xlim = c(0,1))
plotDist('beta', params=list(50, 10), kind='density', , type = "h", col = "#F1C40F", add = TRUE)
plotDist('beta', params=list(49,2), kind='density', add = TRUE, col = "black")
plotDist('beta', params=list(50, 10), kind='density', add = TRUE, col = "black")

结果: 在此处输入图像描述

我们可以使用“add”参数添加任意数量的分布。 参数type = "h",用于绘制填充分布。 没有它,唯一的线是可见的。 在我的回答中,我画了两条线和两个填充分布。 不过,如果有人能给出更好的答案,我会很高兴。

编辑:我想我找到了完美的答案! 在此处输入图像描述

这是代码:

library(ggformula)
theme_set(theme_bw())
gf_dist("beta", shape1 = 49, shape2 = 2, geom = "area", alpha = 0.5, fill = "#F1C40F")  %>%
gf_dist("beta", shape1 = 49, shape2 = 2) %>% 
gf_dist("beta", shape1 = 50, shape2 = 10, geom = "area", alpha = 0.5, fill = "#3498DB") %>%
gf_dist("beta", shape1 = 50, shape2 = 10)

它比前面的代码快得多,参数 alpha 很明显,并且相对容易组合许多图,因为透明。 您可以很好地看到两个分布的重叠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM