R语言绘制MODIS NDVI时间序列报错:无效子集索引求助
解决R语言绘制MODIS NDVI时间序列的subset报错问题
问题重现
你通过文件名提取日期生成了dates数据框,运行以下绘图代码时出现报错:
year.x =2000 spplot(ndvi_corrected[[year.x]], col.regions = viridis(100), names.attr = dates$Datum[year.x], main = paste('NDVI', dates$Datum[year.x[1]], 'bis', dates$Datum[year_dates[length(year.x)]]))
报错信息:
Error in h(simpleError(msg, call)) : Error evaluating argument 'obj' in method selection for function 'spplot': not a valid subset
但用数字索引(如ndvi_corrected[[36]])的代码能正常运行。
报错原因
ndvi_corrected是列表结构,R中列表的索引只能是位置数字或元素名称,你用year.x=2000(年份数值)作为索引,显然不是列表的有效位置(除非列表有2000个元素,但你用36能运行说明远达不到这个长度),导致subset无效。
解决方案
1. 给dates数据框添加年份列
从Datum列中提取年份,方便后续匹配:
dates$year <- format(dates$Datum, "%Y")
2. 获取2000年影像对应的列表索引
找到所有属于2000年的影像在ndvi_corrected中的位置:
year_2000_indices <- which(dates$year == "2000")
3. 修正绘图代码
- 如果要绘制2000年的所有影像:
spplot(ndvi_corrected[year_2000_indices], col.regions = viridis(100), names.attr = dates$Datum[year_2000_indices], main = paste('NDVI', min(dates$Datum[year_2000_indices]), 'bis', max(dates$Datum[year_2000_indices])))
- 如果要绘制2000年的单张影像(比如第一张):
spplot(ndvi_corrected[[year_2000_indices[1]]], col.regions = viridis(100), names.attr = dates$Datum[year_2000_indices[1]], main = paste('NDVI', dates$Datum[year_2000_indices[1]]))
额外优化建议
你原来用循环rbind生成dates数据框的效率较低,可以替换为更简洁高效的写法:
files <- list.files() dates <- data.frame( file_name = files, Datum = sapply(files, find_date), stringsAsFactors = FALSE )
内容的提问来源于stack exchange,提问作者isabel_wa
相关产品推荐
相关产品推荐

