function scatterPlot (data, x_value, y_value, color_value)
{
const width = 800;
const height = 400;
const margin = { top: 20, right: 30, bottom: 30, left: 50 };
const legendRectWidth = 10
const legendRectHeight = 10
const legendXPosition = width - margin.right - legendRectWidth
const legendVerticalPadding = 10
const legendHorizontalPadding = 15
const yAxisTextVerticalPadding = 45
const xAxisTextVerticalPadding = 10
const axisTextHorizontalPadding = 35
const color = d3.scaleOrdinal(d3.schemeCategory10)
const svg = d3.create("svg")
.attr("width", width)
.attr("height", height);
const scaleX = d3.scaleLinear()
.domain([0, d3.max(data, d => d[x_value])])
.range([margin.left, width - margin.right]);
const scaleY = d3.scaleLinear()
.domain([0, d3.max(data, d => d[y_value])])
.range([margin.top, height - margin.bottom]);
svg.selectAll("circle")
.data(data)
.enter()
.append("circle")
.attr("cx", (d, i) => scaleX(d[x_value]))
.attr("cy", (d, i) => scaleY(d[y_value]))
.attr("r", 5)
.style("fill", d => color(d[color_value]))
const xAxis = createAxis(scaleX, d3.axisBottom, `translate(0, ${height - margin.bottom})`)
svg.append("g")
.call(xAxis);
const yAxis = createAxis(scaleY, d3.axisLeft, `translate(${margin.left}, 0)`)
svg.append("g")
.call(yAxis);
const colors_values = new Set(data.map(d => d[color_value]))
createLegend(svg, legendXPosition, colors_values, color, {
width,
margin,
rectWidth: legendRectWidth,
rectHeight: legendRectHeight,
verticalPadding: legendVerticalPadding,
horizontalPadding: legendHorizontalPadding,
});
svg.append("text")
.attr("x", margin.left)
.attr("y", margin.top + yAxisTextVerticalPadding)
.attr("transform", `rotate(-90, ${margin.left - axisTextHorizontalPadding}, ${margin.top + yAxisTextVerticalPadding})`)
.text(y_value)
.attr("text-anchor", "end")
.style("font-size", "13px");
svg.append("text")
.attr("x", width - margin.right - axisTextHorizontalPadding)
.attr("y", height - margin.bottom - xAxisTextVerticalPadding)
.text(x_value)
.attr("text-anchor", "end")
.style("font-size", "13px");
return svg.node()
}