水文Flow-return_period数据的ggplot平滑方法及轴刻度调整问询
水文学低流量频率曲线ggplot实现问题解答
1. 流量数据集适用的ggplot平滑方法
针对低流量频率分析的数据集,推荐以下几种平滑/拟合方法:
- Loess局部加权回归:适合小样本的非线性趋势捕捉,是ggplot默认平滑方法之一,代码中用
method = "loess"即可,无需额外包。 - GAM广义可加模型:能更好拟合复杂的非线性关系,需要加载
mgcv包,通过method = "gam", formula = y ~ s(x)指定平滑项。 - GLM广义线性模型:如果假设流量与重现期满足对数线性等关系(比如对数正态分布假设),可指定对应链接函数(如
family = gaussian(link = "log"))。 - 专业水文频率拟合:这是水文学领域的标准做法,先通过
fitdistrplus等包拟合频率分布(如对数皮尔逊III型、耿贝尔分布),再生成预测序列后用geom_line()绘制拟合曲线,更符合水文专业需求。
2. 轴刻度调整(匹配附图2、3样式)
附图2、3核心是对数刻度+自定义刻度标签,实现步骤如下:
(1)设置对数坐标轴
使用scale_x_log10()/scale_y_log10()快速切换为对数刻度,或用scale_*_continuous(trans = "log10")实现更灵活的配置。
(2)自定义刻度与标签
通过breaks指定刻度位置,labels设置显示文本;如果需要附图3的科学计数法样式(10^x),可借助scales包的格式化函数。
完整示例代码
# 加载所需包 library(ggplot2) library(mgcv) library(scales) # 导入数据集 df <- data.frame( Flow = c(1044, 255, 37, 9.96, 5, 3.35, 3), return_period = c(1, 1.5, 2, 5, 10, 20, 50) ) # 绘制匹配附图样式的低流量频率曲线 ggplot(df, aes(x = return_period, y = Flow)) + geom_point(size = 2) + geom_smooth(method = "loess", se = FALSE, color = "#2c3e50") + # x轴对数刻度+自定义刻度标签 scale_x_log10(breaks = c(1, 2, 5, 10, 20, 50), labels = c("1", "2", "5", "10", "20", "50")) + # y轴对数刻度+科学计数法标签(匹配附图3) scale_y_log10(breaks = c(1, 10, 100, 1000), labels = trans_format("log10", math_format(10^.x))) + # 添加对数刻度的辅助小刻度线 annotation_logticks() + theme_bw() + labs(x = "重现期", y = "流量 (m³/s)")
内容的提问来源于stack exchange,提问作者rojina deshar
相关产品推荐
相关产品推荐

