diff --git a/app.qmd b/app.qmd index d6ded86..cf24135 100644 --- a/app.qmd +++ b/app.qmd @@ -39,38 +39,31 @@ chart = { const controlsContainer = container.append("div") .style("display", "flex") .style("gap", "20px"); - // μ slider control - const muControl = controlsContainer.append("div").style("display","flex").style("align-items","center").style("gap","10px"); - muControl.append("label").text("Mu:").style("font-size","20px"); - muControl.append("input") - .attr("type","range").attr("min",minMu).attr("max",maxMu).attr("step",0.2) - .property("value",selectedMu) - .on("input", function() { selectedMu = +this.value; muControl.select("span").text(selectedMu); updateChart(filteredData()); }); - muControl.append("span").text(selectedMu).style("font-size","20px"); - // sigma control - const sigControl = controlsContainer.append("div").style("display","flex").style("align-items","center").style("gap","10px"); - sigControl.append("label").text("Sigma:").style("font-size","20px"); - sigControl.append("input") - .attr("type","range").attr("min", -2).attr("max", 2).attr("step", 1) - .property("value", Math.log2(selectedSig)) - .on("input", function() { selectedSig = 2 ** (+this.value); sigControl.select("span").text(selectedSig); updateChart(filteredData()); }); - sigControl.append("span").text(selectedSig).style("font-size","20px"); - // nonc control - const noncControl = controlsContainer.append("div").style("display","flex").style("align-items","center").style("gap","10px"); - noncControl.append("label").text("Noncentrality:").style("font-size","20px"); - noncControl.append("input") - .attr("type","range").attr("min", -4).attr("max", 4).attr("step", 2) - .property("value", selectedNonc) - .on("input", function() { selectedNonc = +this.value; noncControl.select("span").text(selectedNonc); updateChart(filteredData()); }); - noncControl.append("span").text(selectedNonc).style("font-size","20px"); - // tail weight control - const tailwControl = controlsContainer.append("div").style("display","flex").style("align-items","center").style("gap","10px"); - tailwControl.append("label").text("Tailweight:").style("font-size","20px"); - tailwControl.append("input") - .attr("type","range").attr("min", -2).attr("max", 2).attr("step", 1) - .property("value", Math.log2(selectedTailw)) - .on("input", function() { selectedTailw = 2 ** (+this.value); tailwControl.select("span").text(selectedTailw); updateChart(filteredData()); }); - tailwControl.append("span").text(selectedTailw).style("font-size","20px"); + // slider controls + const sliders = [ + { label: 'Mu', get: () => selectedMu, set: v => selectedMu = v, min: minMu, max: maxMu, step: 0.2 }, + { label: 'Sigma', get: () => Math.log2(selectedSig), set: v => selectedSig = 2 ** v, min: -2, max: 2, step: 1 }, + { label: 'Noncentrality', get: () => selectedNonc, set: v => selectedNonc = v, min: -4, max: 4, step: 2 }, + { label: 'Tailweight', get: () => Math.log2(selectedTailw), set: v => selectedTailw = 2 ** v, min: -2, max: 2, step: 1 } + ]; + sliders.forEach(s => { + const ctrl = controlsContainer.append('div').style('display','flex').style('align-items','center').style('gap','10px'); + ctrl.append('label').text(`${s.label}:`).style('font-size','20px'); + ctrl.append('input') + .attr('type','range') + .attr('min', s.min) + .attr('max', s.max) + .attr('step', s.step) + .property('value', s.get()) + .on('input', function() { + const val = +this.value; + s.set(val); + ctrl.select('span').text(s.label === 'Sigma' || s.label === 'Tailweight' ? (2 ** val) : val); + updateChart(filteredData()); + }) + .style('width', '100%').style('box-sizing', 'border-box'); + ctrl.append('span').text(s.label === 'Sigma' || s.label === 'Tailweight' ? selectedSig : s.get()).style('font-size','20px'); + }); // Build SVG const width = 800; const height = 400;