{
const temperatureData = [
{ date: "2023-05-20", average: 18, minimum: 15, maximum: 21 },
{ date: "2023-05-21", average: 20, minimum: 16, maximum: 24 },
{ date: "2023-05-22", average: 19, minimum: 17, maximum: 22 },
{ date: "2023-05-23", average: 17, minimum: 13, maximum: 20 },
{ date: "2023-05-24", average: 16, minimum: 12, maximum: 19 },
{ date: "2023-05-25", average: 19, minimum: 15, maximum: 23 },
{ date: "2023-05-26", average: 22, minimum: 18, maximum: 25 }
];
const height = 300;
const margin = { top: 20, right: 20, bottom: 30, left: 40 };
const svg = d3.select(DOM.svg(width, height));
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const parseDate = d3.timeParse("%Y-%m-%d");
const formatDate = d3.timeFormat("%Y-%m-%d");
temperatureData.forEach((d) => {
d.date = parseDate(d.date);
});
const xScale = d3
.scaleTime()
.domain(d3.extent(temperatureData, (d) => new Date(d.date)))
.range([0, innerWidth]);
const yScale = d3
.scaleLinear()
.domain([
d3.min(temperatureData, (d) => d.minimum),
d3.max(temperatureData, (d) => d.maximum)
])
.range([innerHeight, 0]);
const lineAverage = d3
.line()
.x((d) => xScale(d.date))
.y((d) => yScale(d.average));
const lineMinimum = d3
.line()
.x((d) => xScale(d.date))
.y((d) => yScale(d.minimum));
const lineMaximum = d3
.line()
.x((d) => xScale(d.date))
.y((d) => yScale(d.maximum));
const g = svg
.append("g")
.attr("transform", `translate(${margin.left},${margin.top})`);
g.append("g")
.attr("class", "x-axis")
.attr("transform", `translate(0, ${innerHeight})`)
.call(d3.axisBottom(xScale).tickFormat(formatDate));
g.append("g").attr("class", "y-axis").call(d3.axisLeft(yScale));
g.append("path")
.datum(temperatureData)
.attr("class", "line")
.attr("d", lineAverage)
.attr("fill", "none")
.attr("stroke", "deeppink");
g.append("path")
.datum(temperatureData)
.attr("class", "line")
.attr("d", lineMinimum)
.attr("fill", "none")
.attr("stroke", "green");
g.append("path")
.datum(temperatureData)
.attr("class", "line")
.attr("d", lineMaximum)
.attr("fill", "none")
.attr("stroke", "red");
return svg.node();
}