mesh={
const width=950;
const height=900;
const margin = ({top: 20, right: 20, bottom: 20, left: 20})
const svg = d3.select(DOM.svg(width, height));
const subjectamount=d3.max(OvalData, d => d.cy);
const monthamount=d3.max(OvalData, d => d.cx);
const separation=height/subjectamount;
var scaleX = d3.scaleLinear().domain([0,monthamount]) .nice().range([margin.left, width-margin.right]);
var scaleY = d3.scaleLinear().domain([0,subjectamount]).nice().range([margin.top, height-margin.bottom]);
function make_x_gridlines() { return d3.axisBottom(scaleX) }
function make_y_gridlines() { return d3.axisLeft(scaleY) }
svg.append("g")
.attr("class", "grid")
.attr("color", "darkgrey")
.attr("opacity", 0.4)
.style("stroke-width", 5)
.attr("transform", "translate( 0, "+ (height-margin.bottom+separation) +") ")
.call(make_x_gridlines().tickSize(-height+margin.top+margin.bottom-(separation*2)) .tickFormat("")
.ticks(monthamount) )
svg.append("g")
.attr("class", "grid")
.attr("color", "#e3428a")
.attr("opacity", 0.4)
.style("stroke-width", 2)
.attr("transform", "translate( "+ (margin.left) +", 0) ")
.call(make_y_gridlines() .tickSize(-width+margin.left+margin.right) .tickFormat("") .ticks(subjectamount) )
svg.append("g")
.attr("class", "grid")
.attr("color", "#0486cc")
.attr("opacity", 0.4)
.style("stroke-width", 2)
.attr("transform", "translate( "+ (margin.left) +", "+ (separation/6) +") ")
.call(make_y_gridlines() .tickSize(-width+margin.left+margin.right) .tickFormat("") .ticks(subjectamount) )
// ADDING THE KNOTS=ELLIPSES ////////////////////////////////////////////////////////////////////////
svg.selectAll("ellipse1")
.data(OvalData)
.enter()
.append("ellipse")
.attr("cx", d => scaleX( d.cx ) )
.attr("cy", d => scaleY( d.cy ) +separation/12 )
.attr("rx", d => d.rminor/(separation/6))
.attr("ry", d => d.rmajor/(separation/6))
.attr('fill-opacity', .8)
.attr('fill', "#e3428a")
.attr("transform", d=>`rotate(45, ${scaleX(d.cx)}, ${scaleY(d.cy)+separation/12})`)
svg.selectAll("ellipse2")
.data(OvalData)
.enter()
.append("ellipse")
.attr("cx", d => scaleX(d.cx ) )
.attr("cy", d => scaleY(d.cy) +separation/12)
.attr("rx", d => d.rminor/(separation/6))
.attr("ry", d => d.rmajor/(separation/6))
.attr('fill-opacity', .8)
.attr('fill', "#0486cc")
.attr("transform", d=>`rotate(-45,${scaleX(d.cx)}, ${scaleY(d.cy)+separation/12})`)
svg.selectAll("circle")
.data(OvalData)
.enter()
.append("circle")
.attr("cx", d => scaleX(d.cx ) )
.attr("cy", d => scaleY(d.cy) +separation/10)
.attr("r", d => (separation/12 ))
.attr('fill-opacity', 0)
.attr('fill', "black")
.attr("transform", d=>`rotate(-0,${scaleX(d.cx)}, ${scaleY(d.cy)+separation/12})`)
return svg.node();
}