使用ggplot2优化散点图平滑线并添加数据点标注的技术问询
ggplot2散点图问题解决方案
问题说明
- 使用
loess方法绘制的平滑拟合线效果不理想 - 需要为每个散点添加对应的
Metric标签
数据集
Metric<-c("zero", "D", "H", "W", "P", "C", "J", "L", "N", "M") F<-c(0, 0.11, 0.26, 0.07, 0.5, 0.07, 0.26, 0.05, 0.29, 0.03) T<-c(0, 0.5, 0.9, 0.6, 0.9, 0.5, 0.9, 0.8, 0.9, 0.8) FinalTable<-data.frame(Metric, F, T)
解决方案
1. 优化平滑拟合线
loess的拟合效果核心受span参数影响,默认值为0.75:
- 增大
span会让拟合线更平滑 - 减小
span会让拟合线更贴近数据点
如果loess仍达不到预期,也可以尝试method="gam"(需加载mgcv包)或多项式线性拟合。
调整loess参数示例
library(ggplot2) ggplot(FinalTable, aes(F, T)) + geom_point(size=3) + coord_cartesian(xlim=c(0,1), ylim=c(0, 1))+ # 调整span为0.9让线更平滑,若需更贴合数据可设为0.5左右 geom_smooth(method="loess", se=FALSE, span=0.9, color="darkred")
gam方法示例
library(ggplot2) library(mgcv) ggplot(FinalTable, aes(F, T)) + geom_point(size=3) + coord_cartesian(xlim=c(0,1), ylim=c(0, 1))+ geom_smooth(method="gam", formula = y ~ s(x), se=FALSE, color="darkblue")
2. 添加散点标签
可以用geom_text做基础标注,若担心标签重叠,推荐用ggrepel包的geom_text_repel自动调整位置。
基础标注方法
library(ggplot2) ggplot(FinalTable, aes(F, T)) + geom_point(size=3) + coord_cartesian(xlim=c(0,1), ylim=c(0, 1))+ geom_smooth(method="loess", se=FALSE, span=0.9)+ # 微调标签位置避免覆盖散点 geom_text(aes(label=Metric), nudge_x=0.02, nudge_y=0.02, size=4)
智能避重叠标注
先安装依赖包:
install.packages("ggrepel")
再运行绘图代码:
library(ggplot2) library(ggrepel) ggplot(FinalTable, aes(F, T)) + geom_point(size=3) + coord_cartesian(xlim=c(0,1), ylim=c(0, 1))+ geom_smooth(method="loess", se=FALSE, span=0.9)+ geom_text_repel(aes(label=Metric), size=4, box.padding=0.3)
内容的提问来源于stack exchange,提问作者JamesLancaster
相关产品推荐
相关产品推荐

