You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

水文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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:28:25