You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:23:20