请求将贝叶斯推理绘图代码适配为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
相关产品推荐
相关产品推荐

