如何利用ggplot2的aes功能在同一张图绘制多个stat_function曲线
基于ggplot2批量绘制分布PDF曲线(以Beta分布为例)
问题场景
现有存储Beta分布参数的数据框,其中dist为分组标识,beta1、beta2对应Beta分布的两个形状参数(shape1和shape2),数据框定义如下:
df <- data.frame(dist = c("a", "b", "c"), beta1 = c(1,3,5), beta2 = c(3,3,3))
需求是在同一张图上绘制所有分组的PDF曲线,并按dist自动生成图例,希望通过ggplot的aes映射实现,替代手动逐个添加stat_function的繁琐方式。
解决方案
方案一:生成完整数据后用geom_line绘制(推荐)
这种方式贴合ggplot“数据驱动”的设计逻辑,先计算所有需要绘制的PDF值,再通过映射实现批量绘图:
library(ggplot2) library(dplyr) library(tidyr) # 生成x轴连续序列,保证曲线平滑 x_vals <- seq(0, 1, length.out = 1000) # 为每个分组计算对应x值的PDF,整理成绘图用数据框 plot_data <- df %>% rowwise() %>% mutate(pdf = list(dbeta(x_vals, shape1 = beta1, shape2 = beta2))) %>% unnest(pdf) %>% mutate(x = rep(x_vals, nrow(df))) # 绘制曲线并映射颜色到分组 ggplot(plot_data, aes(x = x, y = pdf, color = dist)) + geom_line(linewidth = 1) + labs(x = "x", y = "Beta分布概率密度", color = "分组") + theme_minimal()
方案二:迭代添加stat_function图层
如果偏好使用stat_function,可以通过迭代数据框行批量添加图层,同时用aes映射颜色:
library(ggplot2) library(purrr) # 初始化ggplot对象 p <- ggplot(data.frame(x = c(0,1)), aes(x)) # 遍历数据框每行,为每个分组添加对应的stat_function图层 p <- p %>% pmap(df, function(dist, beta1, beta2) { stat_function(fun = dbeta, aes(color = dist), args = list(shape1 = beta1, shape2 = beta2), linewidth = 1) }) %>% reduce(`+`) # 添加标签和主题样式 p <- p + labs(color = "分组", x = "x", y = "Beta分布概率密度") + theme_minimal() print(p)
内容的提问来源于stack exchange,提问作者Tommy Glizda
相关产品推荐
相关产品推荐

