如何在R中结合绘制箱线图与函数曲线(ggplot2及基础绘图实现)
函数曲线与箱线图叠加的两种实现方法
问题核心
你之前的代码效果不佳,根源是箱线图的x轴被当作离散变量处理,而函数曲线需要连续x轴,两者坐标系不匹配。下面分别给出ggplot2和基础R的正确实现方式。
一、使用ggplot2实现
把x保留为连续变量,通过group=x让箱线图按每个x值分组绘制,这样x轴始终是连续的,geom_function就能正确匹配坐标系:
f <- function (x) x*(1-exp(-(24)/(1+0.2*x))) x <- rep(seq(0,100,by=10),each=100) y <- rnorm(length(x),f(x),1) library(ggplot2) dat <- data.frame(x=x,y=y) # 修改后的代码:x不用转成factor,用group=x指定箱线图分组 ggplot(dat,aes(x=x,y=y)) + geom_boxplot(aes(group=x)) + # 按x的每个取值分组画箱线图 geom_function(fun=f,color="red")
说明
- 去掉
x=factor(x),让x保持连续数值型,确保坐标系统一。 aes(group=x)告诉ggplot2按x的每个唯一值分组绘制箱线图,既实现分组效果,又保留x轴的连续性。
二、不使用ggplot2(基础R绘图)
基础R中boxplot()处理数值型x时,会自动将其转为离散因子,x轴位置为1到n(n为x的唯一值数量)。需要把函数曲线的x值映射到这个离散位置上,再绘制曲线:
f <- function (x) x*(1-exp(-(24)/(1+0.2*x))) x <- rep(seq(0,100,by=10),each=100) y <- rnorm(length(x),f(x),1) # 绘制箱线图并保存绘图对象 bp <- boxplot(y~x, xlab="x", ylab="y") # 生成连续x值,并映射到箱线图的x轴位置 xx <- seq(0,100,length=100) # 映射公式:x值0对应位置1,10对应2,...100对应11,即pos = xx/10 +1 pos <- xx / 10 + 1 # 绘制函数曲线 lines(pos, f(xx), col="red", lwd=2)
说明
- 保存
boxplot()的返回对象bp,可通过bp$names查看x轴的因子标签,确认位置对应关系。 - 用
pos <- xx/10 +1将连续的xx(0-100)转换为箱线图的x轴位置(1-11),确保曲线和箱线图的x轴对齐。 - 使用
lines()绘制连续曲线,比points(type="l")更贴合需求。
内容的提问来源于stack exchange,提问作者quibble
相关产品推荐
相关产品推荐

