containers = {
const div = d3.select(DOM.element('div'))
.style("margin", "auto")
.attr("width", `${layoutOpts.width}px`)
.attr("height", `${layoutOpts.height}px`)
.attr("class", "container")
.style("display","block");
const svg = div.append("svg")
.attr("width", `${layoutOpts.width}px`)
.attr("height", `${layoutOpts.height}px`)
.attr("class", "svg-container")
.attr("xmlns", "http://www.w3.org/2000/svg")
.append("g")
.attr("transform", `translate(${layoutOpts.margin.l},${layoutOpts.margin.t})`);
const XX = svg.append("g")
.call(gX);
const YY = svg.append("g")
.call(gY);
const XLAB = svg.append("g")
.call(xlabeler);
const YLAB = svg.append("g")
.call(ylabeler);
const canvas = div.append("canvas")
.attr("width", layoutOpts.width)
.attr("height", layoutOpts.height)
.style("margin", `${layoutOpts.margin.t}px ${layoutOpts.margin.r}px ${layoutOpts.margin.b}px ${layoutOpts.margin.l}px`)
.attr("class", "canvas-container");
const pointmap = div.append("canvas")
.attr("width", layoutOpts.width)
.attr("height", layoutOpts.height)
.style("margin", `${layoutOpts.margin.t}px ${layoutOpts.margin.r}px ${layoutOpts.margin.b}px ${layoutOpts.margin.l}px`)
.attr("class", "pointmap-container")
.attr("tabindex", "0");
const context = canvas.node().getContext('2d');
context.rect(1,1,extents.width-7,extents.height-1);
context.clip();
const pointctx = pointmap.node().getContext('2d');
pointctx.rect(1,1,extents.width-7,extents.height-1);
pointctx.clip();
let databin = d3.select(document.createElement('custom'));
let pointbin = d3.select(document.createElement('custom'));
return {div:div,svg:svg,canvas:canvas,context:context, pointmap:pointmap, pointctx:pointctx, databin:databin,pointbin:pointbin,X:XX,Y:YY,ylab:YLAB,xlab:XLAB}
}