如何在R语言中为散点图添加正态边缘分布?
在R语言中为ggplot图表添加正态边缘分布
如果想要给你的双变量ggplot图表(比如散点图)在顶部和右侧添加边缘分布(包括正态拟合的密度曲线),ggExtra包中的ggMarginal()函数是非常便捷的工具。下面是完整的实现示例和细节说明:
步骤1:安装并加载所需包
首先确保你已经安装了ggplot2和ggExtra包,要是还没装的话先执行安装命令:
install.packages(c("ggplot2", "ggExtra")) library(ggplot2) library(ggExtra)
注:原示例中的border()函数来自ggpubr包,如果需要保留这个功能,得额外安装并加载ggpubr
步骤2:准备模拟数据
我们用威布尔分布生成两组模拟数据,并整理成ggplot友好的数据框格式:
# 生成威布尔分布的模拟数据 x <- rweibull(100, 2.6, 3) y <- rweibull(100, 1.8, 3) # 转换为数据框 xy.df <- data.frame(x, y)
步骤3:创建基础ggplot图表
先绘制包含散点和2D密度线的基础图表,搭配简洁的经典主题:
p1 <- ggplot(xy.df, aes(x, y)) + geom_point(colour = "blue", size = 0.25) + # 添加蓝色小散点 geom_density2d() + # 叠加2D密度轮廓线 theme_classic() # 使用无背景的经典主题
步骤4:添加正态边缘分布
根据需求,我们可以选择两种常见的边缘分布展示方式:
方式1:添加核密度边缘(近似正态形态)
直接用ggMarginal()添加顶部和右侧的核密度图,能直观呈现变量的分布趋势:
ggMarginal(p1, type = "density", fill = "lightblue", colour = "black")
type="density":指定边缘图为核密度类型,形态接近正态分布fill和colour:自定义密度图的填充色与边框色
方式2:添加带正态拟合曲线的边缘分布
如果你想要明确展示拟合的正态分布曲线,可以通过参数自定义边缘图层,叠加正态曲线:
ggMarginal(p1, type = "density", marginal.params = list( geom = "density", fill = "lightblue", colour = "black" ), # 在边缘图上叠加红色正态拟合曲线 panel.params = list( geom = "line", stat = "function", fun = dnorm, args = list(mean = mean(xy.df$x), sd = sd(xy.df$x)), colour = "red", size = 1 ) )
这里通过stat="function"调用dnorm函数,基于数据的均值和标准差拟合正态曲线,用红色线条突出显示。
额外小贴士
- 可以通过
margins参数指定只添加某一侧的边缘图,比如margins = "x"只在顶部添加x变量的边缘分布 - 除了
density类型,还能选择histogram(直方图)、boxplot(箱线图)等其他边缘图类型
内容的提问来源于stack exchange,提问作者EM823823




