使用RavenR包的rvn_budyko_plot函数绘制Budyko曲线失败,报条件长度大于1错误
使用RavenR包的rvn_budyko_plot函数绘制Budyko曲线失败,报条件长度大于1错误
嘿,我看了你的问题和代码,主要是列名不匹配加上对函数参数的小误解导致的,咱们一步步来搞定它:
首先,修正最直接的列名错误
你在生成budyko2的时候,写了ARIDITY=ARIDITY和EVAPORATION=EVAPORATION,但你的实际数据里对应的列是Aridity_ind和Evaporative_ind啊!这就导致生成的x_indices根本没有正确的列,自然会触发奇怪的错误。把这部分代码改成下面这样:
budyko2 <- Budyko_data %>% filter(year(Date) != 2013) %>% mutate( Date = Date, ARIDITY = Aridity_ind, # 对应你实际计算的干旱指数列 EVAPORATION = Evaporative_ind # 对应你实际计算的蒸发指数列 ) %>% select(Date, ARIDITY, EVAPORATION) x_indices <- as.xts(budyko2)
其次,搞懂rvn_budyko_plot的参数逻辑
你可能有点搞混了x和x_indices的作用:
x是必须的,需要包含PET、AET、PRECIP这三列的xts对象,函数可以基于这些值自动计算干旱指数和蒸发指数x_indices是可选的,只有当你已经手动计算好ARIDITY(PET/PRECIP)和EVAPORATION(AET/PRECIP)时才需要传,而且列名必须严格是这两个词
你遇到的“条件长度大于1”的错误,本质是函数内部检查x_indices列名时,c("PET", "AET", "PRECIP") %notin% names(x_indices)返回了3个逻辑值(每个列名检查一次),而if语句只能接受单个布尔值——这就是因为你的x_indices列名不对,导致判断逻辑出问题了。
更简单的解决方案:让函数自动计算指数
其实你完全不用手动计算那两个指数,直接把整理好的x传给函数就行,函数会帮你搞定计算,省得自己折腾列名:
# 先整理好包含PET、AET、PRECIP的xts对象 budyko1 <- Budyko_data %>% filter(year(Date) != 2013) %>% select(Date, PET, AET, PRECIP) x <- as.xts(budyko1, order.by = budyko1$Date) # 直接绘图,不用传x_indices rvn_budyko_plot(x, limiting_labels = TRUE, budyko_curve = TRUE, mm = 9, d = 30)
额外优化:简化年度数据的整理
你之前生成年度日期的方式有点绕,直接用year()函数提取年份再生成日期会更清晰:
Budyko_data <- dataset %>% mutate(Year = year(Date)) %>% group_by(Year) %>% summarise( AET = sum(ET, na.rm = TRUE), PRECIP = sum(P_F, na.rm = TRUE), PET = sum(ETPot, na.rm = TRUE), Date = as.Date(paste(Year, "01", "01", sep = "-")) ) %>% ungroup() %>% filter(Year != 2013)
按照上面的步骤改完,应该就能顺利画出Budyko图啦!
备注:内容来源于stack exchange,提问作者Lin
相关产品推荐
相关产品推荐

