如何使用hydroTSM绘制多变量时间序列图?附降水数据示例
多变量月度/季节时间序列图绘制方案
你的每日降水数据结构如下:
> head(df) I_2004 G_2004 T_2004 Date 1 3628.79853 2199.310 12741.413 2004-01-01 2 1556.66704 4322.884 5464.395 2004-01-02 3 20.43379 5592.103 72.998 2004-01-03 4 265.94247 8145.041 942.344 2004-01-04 5 914.93958 9668.531 3227.579 2004-01-05 6 2585.63558 6825.905 9043.866 2004-01-06
以下是使用hydroTSM及其他工具简化多变量月度/季节时序图绘制的方案:
一、使用hydroTSM实现
hydroTSM内置了水文时间序列的聚合与绘图工具,无需手动子集化,直接从日数据生成月度/季节时序图:
1. 数据格式转换
首先将数据转为xts对象(hydroTSM的核心数据格式):
library(hydroTSM) library(xts) # 确保Date列为日期格式 df$Date <- as.Date(df$Date) # 转换为xts对象,Date作为索引 xts_data <- xts(df[, !names(df) %in% "Date"], order.by = df$Date)
2. 月度时序图
通过daily2monthly一键聚合日数据为月度数据,直接绘图:
# 按月度求和聚合降水数据 monthly_data <- daily2monthly(xts_data, FUN = sum) # 绘制多变量月度时序图 plot(monthly_data, main = "月度降水时序图", col = c("#E63946", "#457B9D", "#1D3557"), lwd = 2) # 添加图例 legend("topright", legend = colnames(monthly_data), col = c("#E63946", "#457B9D", "#1D3557"), lwd = 2)
3. 季节时序图
使用daily2seasonal聚合为季节数据(默认北半球季节:DJF、MAM、JJA、SON):
# 按季节求和聚合 seasonal_data <- daily2seasonal(xts_data, FUN = sum) # 绘制多变量季节时序图 plot(seasonal_data, main = "季节降水时序图", col = c("#E63946", "#457B9D", "#1D3557"), lwd = 2) legend("topright", legend = colnames(seasonal_data), col = c("#E63946", "#457B9D", "#1D3557"), lwd = 2)
二、基于tidyverse的简化流程
如果习惯ggplot2风格,可通过lubridate+dplyr的组合,避免手动melt和子集化,高效处理多年数据:
1. 月度时序图
library(tidyverse) library(lubridate) df %>% # 按月份分组 mutate(month_date = floor_date(Date, "month")) %>% group_by(month_date) %>% # 聚合各变量月度总和 summarise(across(c(I_2004, G_2004, T_2004), sum, .names = "{.col}")) %>% # 宽表转长表 pivot_longer(-month_date, names_to = "站点", values_to = "降水量") %>% ggplot(aes(x = month_date, y = 降水量, color = 站点)) + geom_line(linewidth = 1) + labs(title = "月度降水时序图") + theme_minimal()
2. 季节时序图
df %>% # 定义季节与年度-季节标识 mutate( season = case_when( month(Date) %in% c(12,1,2) ~ "DJF", month(Date) %in% c(3,4,5) ~ "MAM", month(Date) %in% c(6,7,8) ~ "JJA", month(Date) %in% c(9,10,11) ~ "SON" ), year_season = paste(year(Date), season, sep = "-") ) %>% group_by(year_season, season) %>% summarise(across(c(I_2004, G_2004, T_2004), sum, .names = "{.col}")) %>% pivot_longer(-c(year_season, season), names_to = "站点", values_to = "降水量") %>% ggplot(aes(x = year_season, y = 降水量, color = 站点, group = 站点)) + geom_line(linewidth = 1) + labs(title = "季节降水时序图") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + theme_minimal()
内容的提问来源于stack exchange,提问作者CovetTachi
相关产品推荐
相关产品推荐

