chart = {
const svg = d3.select(DOM.svg(width, height))
.style("width", "60%")
.style("height", "auto")
.style("font", "4.5px sans-serif")
;
svg.append("rect")
.attr("width", "100%")
.attr("height", "100%")
.attr("fill", "pink")
;
svg.append("line")
.attr("x1", 150)
.attr("y1", 170)
.attr("x2", 155)
.attr("y2", 170)
.attr("stroke-width", "0.65")
.attr("stroke", "gray")
;
svg.append("circle")
.attr("r", radius)
.attr("cx", 150)
.attr("cy", 180)
.attr("fill", "red")
;
svg.append("circle")
.attr("r", radius)
.attr("cx", 150)
.attr("cy", 170)
.attr("fill", "gray")
;
svg.append("rect")
.attr("x", 148)
.attr("y", 187.5)
.attr("width", 4)
.attr("height", 4)
.attr("fill", "orange")
;
svg.append("text") // axis tick number
.attr("x", 157)
.attr("y", 171)
.text("sample mean")
svg.append("text") // axis tick number
.attr("x", 157)
.attr("y", 181)
.text("visual bootstrap")
svg.append("text") // axis tick number
.attr("x", 157)
.attr("y", 191)
.text("vb distribution")
// svg.append("g") // y axis
// .attr('class','axis')
// .call(yAxis)
// .attr("transform", "translate(97.5,0)");
svg.append("line") // y axis
.attr("x1", 97.5)
.attr("y1", y(35))
.attr("x2", 97.5)
.attr("y2", y(40))
.attr("stroke-width", "0.25")
.attr("stroke", "black")
;
for (let i=35; i < 41; i++) {
svg.append("line") // axis ticks
.attr("x1", 95.5)
.attr("y1", y(i))
.attr("x2", 97.5)
.attr("y2", y(i))
.attr("stroke-width", "0.25")
.attr("stroke", "black")
;
svg.append("text") // axis tick number
.attr("x", 90)
.attr("y", y(i - 0.2))
.attr("class", "axis-tick-marks")
.text(i)
;
}
svg.append("line") // horizon
.attr("x1", 50)
.attr("y1", y(d3.mean(sugars)))
.attr("x2", 150)
.attr("y2", y(d3.mean(sugars)))
.attr("stroke", "gray")
.attr("stroke-width", "0.5")
;
svg.append("circle") // for animated bootstrap mean (red)
.attr("r", radius)
.attr("cx", 100)
.attr("cy", y(d3.mean(sugars)))
.attr("fill", "red")
.attr("id", "bsc")
;
svg.append("circle") // for static sample mean (gray)
.attr("r", radius)
.attr("cx", 50)
.attr("cy", y(d3.mean(sugars)))
.attr("fill", "gray")
;
// histogram of means of 100,000 bootstrap samples (done in Python)
svg.append("g")
.attr("id", "histo")
.selectAll("rect")
.data(histoD)
.enter()
.append("rect")
.attr("x", 145)
.attr("y", function (d) {return y(d.xl) - histobarHeight})
.attr("width", function (d) {return d.ct / 3000})
.attr("height", histobarHeight)
.attr("fill", "orange")
;
svg.append("text")
.style("font", "12px Source Serif Pro")
.attr("x", 10)
.attr("y", 20)
.text("example: Visual Bootstrap");
svg.append("text")
.style("font", "5px Source Serif Pro")
.attr("x", 12)
.attr("y", 30)
.text("mean of percentage of sugar in breakfast cereal");
// var line = d3.line()
// .x(function(d) { return x((d.x0 + d.x1)/2); })
// .y(function(d) { return y(d.length); })
// .curve(d3.curveCatmullRom.alpha(0.5))
// ;
function bootstrapIt() {
svg.selectAll("#bsc")
.data([d3.mean(sampleWithReplacement(sugars, sugars.length))])
.transition()
.attr("r", radius)
.attr("cx", 100)
.attr("cy", function(d) {return y(d); }) ;
}
if (animate) {setInterval(bootstrapIt, 500)}
return svg.node();
}