问题描述
我目前正在尝试在同一张图表中绘制每月和每年土壤湿度的时间序列。我有一个ImageCollection,其中包含480张图像(每月一个),另一个ImageCollection中具有40个图像(每年一个)。
我能够分别绘制它们,但是我还没有找到将两个图表堆叠在一个图表中的方法。我查找的一些选项是(a)事先做一个innerJoin(),但这会将每月收集的样本从480个图像缩减为40个,或(b)用Na填补年度收集的空白(类似于使用熊猫的fillNa) ,但我想不出办法。
下面是代码示例:
// --- GLOBALS ---
var dateStart = ee.Date('1980-01-01');
var dateEnd = ee.Date('2019-12-31');
var scale = 1000;
var studyArea = ee.FeatureCollection('TIGER/2018/States').filterMetadata('NAME','equals','Nevada');
var monthlySoil = ee.ImageCollection('IDAHO_EPSCOR/TERRAclimATE') // Load data
.filter(ee.Filter.date(dateStart,dateEnd))
.select('soil');
// --- TIME SERIES ---
// Create list of dates for time series
var dateListYearly = ee.List.sequence(0,dateEnd.difference(dateStart,'year').round(),1);
var makeDateListYearly = function(n) {return dateStart.advance(n,'year')};
dateListYearly = dateListYearly.map(makeDateListYearly);
// Yearly data
var yearlySoil = [];
yearlySoil = dateListYearly.map(function(d){ // Resample yearly
var start = ee.Date(d);
var end = ee.Date(d).advance(1,'year');
var daterange = ee.Daterange(start,end);
var yearlySoilInter = monthlySoil
.filterDate(daterange)
.mean()
.clip(studyArea)
.rename('Yearly');
return(yearlySoilInter.set('system:time_start',start.millis())); // Add time band
});
yearlySoil = ee.ImageCollection(yearlySoil);
// --- PLOT ---
var options1 = { // Monthly
title: 'SM Monthly',fontSize: 12,hAxis: {title: 'Date'},vAxis: {title: 'SM (mm)'},series: {0: {color: 'red'}}
};
print(ui.Chart.image.series(monthlySoil,studyArea,ee.Reducer.mean(),scale).setoptions(options1));
var options2 = { // Yearly
title: 'SM yearly',series: {0: {color: 'blue'}}
};
print(ui.Chart.image.series(yearlySoil,scale).setoptions(options2));
并链接:https://code.earthengine.google.com/d0f5823ad6cd737291a9928e264ad4c6
谢谢!
解决方法
与您用 NA 填补空白的想法类似,我向每个集合添加了一个空条带,以匹配另一个集合中的相应条带。然后我合并了集合并制作了一个图表。
s2sr = s2sr.filterBounds(roi).filter(ee.Filter.calendarRange(2020,2020,'year'))
l8sr = l8sr.filterBounds(roi).filter(ee.Filter.calendarRange(2020,'year'))
// compute some bands to add to each collection
var addS2Bands = function(image){
var s2nd = image.normalizedDifference(['B4','B3']).rename('s2_nd')
var l8nd = ee.Image().rename('l8_nd') // must add an empty band for select() to work on all images
return image.addBands(s2nd).addBands(l8nd)
}
var addL8Bands = function(image){
var l8nd = image.normalizedDifference(['B4','B3']).rename('l8_nd')
var s2nd = ee.Image().rename('s2_nd')
return image.addBands(l8nd).addBands(s2nd)
}
l8sr = l8sr.map(addL8Bands)
s2sr = s2sr.map(addS2Bands)
// merge the collections
var merged = l8sr.merge(s2sr).select(['l8_nd','s2_nd'])
// plot the collection
var chart = ui.Chart.image.series({
imageCollection: merged,region: roi,reducer: ee.Reducer.mean(),scale: 30
})
print(chart)