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

请求将贝叶斯推理绘图代码适配为ggplot2风格

ggplot2版本的贝叶斯先验/后验/似然曲线绘图

嗨,我来帮你把基础R代码转换成贴合你给出示例风格的ggplot2绘图,完全匹配你的贝叶斯推理需求。

先明确你的数据与原有绘图逻辑

首先是你用到的数据集:

Data <- c(0.09733344, 0.17540020, 0.14168188, 0.54093074, 0.78151039, 0.28068527, 
          1.96164429, 0.33743328, 0.05200734, 0.09103039, 0.28842044, 0.09240131, 
          0.09143535, 0.38142022, 0.11700952)

你的原有基础R代码是通过生成theta序列,计算三条曲线的值后用基础绘图函数叠加线条:

f_theta<-function(theta,Data){ (theta^length(Data) )*exp(-theta*sum(Data))}
theta<-seq(1,20,length=100)
a=b=0.001
plot(theta,dgamma(theta,a,b),type="l",col="red", ylim=c(0,2),tck=-0.01,cex.lab=0.8,cex.axis=0.8)
lines(theta,dgamma(theta,length(Data)+a,sum(Data)+b),col="green",lty=1)
lines(theta,f_theta(theta,Data=Data),lty=1,col="blue")
legend('topright',legend=c("Prior","Post","Likelihood") ,col=c("red","green","blue","purple"),lty=1,bty="n",cex=0.8)

你参考的ggplot2示例用qplot实现了分组密度图,我们可以把这个思路迁移过来,用更灵活的ggplot2核心语法完成需求。

适配后的ggplot2完整代码

ggplot2的核心是数据框+美学映射,我们先把三条曲线的数据整理成长格式数据框,再进行绘图:

library(ggplot2)

# 1. 定义数据与核心函数
Data <- c(0.09733344, 0.17540020, 0.14168188, 0.54093074, 0.78151039, 0.28068527, 
          1.96164429, 0.33743328, 0.05200734, 0.09103039, 0.28842044, 0.09240131, 
          0.09143535, 0.38142022, 0.11700952)

f_theta <- function(theta, Data){ 
  (theta^length(Data)) * exp(-theta*sum(Data))
}

theta <- seq(1, 20, length = 100)
a <- b <- 0.001

# 2. 整理成ggplot2需要的长格式数据框
plot_df <- data.frame(
  theta = rep(theta, 3),
  value = c(
    dgamma(theta, a, b),                     # 先验曲线值
    dgamma(theta, length(Data)+a, sum(Data)+b), # 后验曲线值
    f_theta(theta, Data)                     # 似然曲线值
  ),
  curve_type = rep(c("Prior", "Post", "Likelihood"), each = 100)
)

# 3. 绘制ggplot2图形
ggplot(plot_df, aes(x = theta, y = value, color = curve_type)) +
  geom_line(linewidth = 1) +
  # 匹配原代码的颜色设置
  scale_color_manual(values = c("Prior" = "red", "Post" = "green", "Likelihood" = "blue")) +
  # 保留原代码的y轴范围
  ylim(0, 2) +
  # 设置标签与标题
  labs(
    x = expression(theta),
    y = "Density / Likelihood Value",
    title = "Prior, Posterior and Likelihood Curves",
    color = "Curve Type"
  ) +
  # 采用和示例一致的简洁主题,也可替换为theme_bw()
  theme_minimal() +
  # 调整文字大小,贴近原代码的cex参数效果
  theme(
    plot.title = element_text(size = 12, hjust = 0.5),
    axis.text = element_text(size = 8),
    axis.title = element_text(size = 8),
    legend.title = element_text(size = 8),
    legend.text = element_text(size = 8)
  )

关键细节说明

  • 数据整理:将重复的theta序列与三条曲线的值合并为一个数据框,用curve_type列区分曲线类型,这是ggplot2处理多组数据的标准方式,比基础绘图的lines()更清晰易维护。
  • 美学映射:把color属性映射到curve_type列,自动生成图例,无需手动调用legend()函数。
  • 样式匹配:保留了你原代码的颜色方案与y轴范围,调整文字大小贴合原绘图的视觉效果,用theme_minimal()实现和参考示例一致的简洁风格。
  • 专业标签:用expression(theta)让x轴显示希腊字母,符合统计绘图的专业规范。

内容的提问来源于stack exchange,提问作者Jonathan1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:00:08