viewof daysBack = Inputs.range([1, numDays], {
value: 14,
step: 1,
label: "Days to look back:"
})
data_with_dates = transpose(dataFrame).map(d => ({
...d,
date: new Date(d.time)
}))
// Filter data based on slider
filtered_data_with_dates = (() => {
const cutoffDate = new Date(Date.now() - (daysBack * 24 * 60 * 60 * 1000));
return data_with_dates.filter(d => d.date >= cutoffDate);
})()
// Update subsampling with filtered data
step = Math.max(1, Math.floor(filtered_data_with_dates.length / 500))
filtered_subsampled_data = filtered_data_with_dates
.filter((d, i) => i % step === 0)
.filter(d => !isNaN(d.pCO2_SBE37) && !isNaN(d.pCO2_SBE37_error))
// Update combined data with filtered data
filtered_combined_data = [
...filtered_subsampled_data.map(d => ({...d, series: "pCO2 SBE37", value: d.pCO2_SBE37})),
...filtered_data_with_dates.map(d => ({...d, series: "xCO2 MAP", value: d.xCO2}))
]
// Update plot to use filtered data
Plot.plot({
width: 1200,
height: 600,
marginLeft: 80,
marginRight: 80,
marginTop: 40,
marginBottom: 60,
style: {
fontFamily: "DM Mono, monospace"
},
x: {
type: "time",
},
y: {
domain: [0, 1000],
label: "xCO₂ (ppm)",
labelFontSize: 16
},
color: {
domain: ["pCO2 SBE37", "xCO2 MAP"],
range: ["gray", "red"],
legend: true
},
grid: true,
marks: [
Plot.link(filtered_subsampled_data, { // Use filtered data
x1: "date",
x2: "date",
y1: d => d.pCO2_SBE37 - d.pCO2_SBE37_error,
y2: d => d.pCO2_SBE37 + d.pCO2_SBE37_error,
stroke: "gray",
strokeOpacity: 0.7,
strokeWidth: 0.5
}),
Plot.dot(filtered_combined_data, { // Use filtered data
x: "date",
y: "value",
fill: "series",
r: 2,
tip: {
format: {
x: d => {
const date = d.toLocaleDateString("en-CA", {timeZone: "America/Los_Angeles"});
const time = d.toLocaleTimeString("en-US", {
timeZone: "America/Los_Angeles",
hour: '2-digit',
minute: '2-digit',
hour12: false
});
return `${date} ${time}`;
}
}
}
})
]
})