如何仅绘制箱线图的lowess平滑线,隐藏箱线图?
只保留lowess平滑线,隐藏箱线图的解决方案
你遇到的问题是boxplot()默认会绘制箱线图,所以即使后续添加了lowess线,箱线图也会保留。这里有两种简单的解决思路:
方法1:让boxplot只计算统计量,不绘图
利用boxplot()的plot = FALSE参数,它会返回箱线图的统计结果但不渲染图形,之后我们手动创建绘图区域并添加lowess线:
# 获取箱线图统计量,但不绘制箱线图 du <- boxplot(Q ~ Duration, plot = FALSE) # 创建空的绘图框架(type="n"表示只画坐标轴,不画数据点) plot( x = du$names, y = du$stats[3,], type = "n", xlab = "Duration", ylab = "Median Q" ) # 添加lowess平滑线 lines(lowess(du$stats[3,], f = 1/5))
方法2:直接计算分组中位数,跳过boxplot
如果你的核心需求是对每个Duration分组的中位数做lowess平滑,完全可以不用boxplot(),直接用tapply()计算中位数后绘图:
# 计算每个Duration分组的中位数(自动忽略NA) group_medians <- tapply(Q, Duration, median, na.rm = TRUE) # 将分组名称转为数值(方便lowess处理) duration_values <- as.numeric(names(group_medians)) # 创建绘图框架 plot( x = duration_values, y = group_medians, type = "n", xlab = "Duration", ylab = "Median Q" ) # 添加lowess平滑线 lines(lowess(duration_values, group_medians, f = 1/5))
额外说明
- 你原来的代码中
boxplot()默认plot = TRUE,所以会先画出箱线图,这就是为什么两种图形同时显示的原因。 - 如果
Duration是连续变量(而非分类分组),其实可以直接对原始数据做lowess,不需要分组:# 先创建空绘图框架 plot(Duration, Q, type = "n", xlab = "Duration", ylab = "Q") # 添加原始数据的lowess平滑线 lines(lowess(Duration, Q, f = 1/5))
内容的提问来源于stack exchange,提问作者user195366




