ScatterPlot=(dataset,var_x,var_y,c)=>{
const width=650
const height=650
const padding=130
const x=d3.scaleLinear()
.domain([d3.min(dataset,(d=>d[var_x])),d3.max(dataset,(d=>d[var_x]))])
.range([padding , width-padding])
const y=d3.scaleLinear()
.domain([d3.min(dataset,(d=>d[var_y])),d3.max(dataset,(d=>d[var_y]))])
.range([ height-padding , padding])
const svg= d3.create("svg")
.attr("width",width)
.attr("height",height)
const color=d3.scaleOrdinal(d3.schemeCategory10)
svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle")
.attr("id", "circle")
.attr("cx", (d) => x(d[var_x]))
.attr("cy", (d) => y(d[var_y]))
.attr("fill", d => color(d[c]))
.attr("stroke", "black")
svg.selectAll("rect").data(color.domain())
.enter()
.append("rect")
.attr("x",width-padding+30)
.attr("y",(d,i)=>i*20+100)
.attr("width",10)
.attr("height",10)
.attr("fill",(d)=>color(d))
.attr("stroke","black")
const shape = d3.scaleOrdinal()
.domain(dataset.map(d => d[c]))
.range(d3.symbols.map(s => d3.symbol().type(s)()))
const marks = svg.selectAll(".marks")
.data(dataset)
.enter().append("path")
.attr("class", "marks")
.attr("transform", d => `translate(${x(d[var_x])},${y(d[var_y])})`)
.attr("fill", d => color(d[c]))
.attr("d", d => shape(d["species"]));
var group = Array.from(d3.group(dataset,d=>d[c]))
svg.selectAll("text").data(group)
.enter()
.append("text")
.attr("x",width-padding + 50)
.attr("y", (d,i) => i*20 + 110)
.text(d=>d[0])
svg.append("text")
.attr("x",(width-padding)/2 - 80,padding/2)
.attr("y",padding-50)
.text(" Variable Axis Y: " + var_y +" / " + " Variable Axis X: " +var_x)
const xAxis=d3.axisBottom(x)
const yAxis=d3.axisLeft(y)
svg.append("g")
.attr("transform","translate(0," + (height-padding) + ")")
.call(xAxis)
svg.append("g")
.attr("transform","translate(" + padding + ",0)")
.call(yAxis)
return svg.node();
}