Spaces:
Running
Running
| /* Copyright 2020 Google LLC. All Rights Reserved. | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| ==============================================================================*/ | |
| window.makeSlider = function(){ | |
| var width = 300 | |
| var height = 30 | |
| var x = d3.scaleLinear() | |
| .domain([.99, .6]) | |
| .range([0, width]) | |
| .clamp(true) | |
| var rv = {} | |
| rv.threshold = .5 | |
| rv.setSlider = makeSetSlider(students, 'threshold') | |
| rv.setSliderF = makeSetSlider(students.filter(d => !d.isMale), 'threshold_f') | |
| rv.setSliderM = makeSetSlider(students.filter(d => d.isMale), 'threshold_m') | |
| var allActiveSel = d3.selectAll('.threshold-rect') | |
| var allHandleSel = d3.selectAll('.threshold-handle') | |
| var gatedSel = d3.select('.gated') | |
| function makeSetSlider(data, key){ | |
| var text = key.split('_')[1] | |
| var drag = d3.drag() | |
| .on('drag', function(d){ | |
| updateThreshold(x.invert(d3.mouse(this)[0])) | |
| // console.log(d3.event.x) | |
| if (text && slider.threshold_f && (slider.threshold_f > 0.9042 || slider.threshold_f - slider.threshold_m > .05)){ | |
| gatedSel.classed('opened', 1) | |
| svg.classed('no-blink', 1) | |
| } | |
| if (key == 'threshold') svg.classed('no-blink', 1) | |
| }) | |
| var svg = d3.select('.slider.' + key).html('') | |
| .append('svg').at({width, height}) | |
| .call(drag) | |
| .st({cursor: 'pointer'}) | |
| if (key == 'threshold_m') svg.classed('no-blink', 1) | |
| svg.append('rect').at({width, height, fill: lcolors.well}) | |
| var rectSel = svg.append('rect.threshold-rect') | |
| .at({width, height, fill: lcolors.sick}) | |
| var handleSel = svg.append('g.threshold-handle') | |
| handleSel.append('text.cursor') | |
| .text('β²') | |
| .at({textAnchor: 'middle', fontSize: 10, y: height, dy: '.8em'}) | |
| handleSel.append('circle') | |
| .at({cy: height, r: 30, fill: 'rgba(0,0,0,0)'}) | |
| var labelText = 'Model Aggressiveness _β' | |
| var _replacement = !text ? '' : 'On ' + (text == 'f' ? 'Women ' : 'Men ') | |
| var labelText = '_Model Aggressiveness β' | |
| var _replacement = !text ? '' : (text == 'f' ? 'Adult ' : 'Adult ') | |
| var labelText = '_Model Decision Point' | |
| var _replacement = !text ? '' : (text == 'f' ? 'Adult ' : 'Adult ') | |
| var labelText = 'Model Decision Point_' | |
| var _replacement = !text ? '' : (text == 'f' ? ' for Adults ' : ' for Children ') | |
| var labelText = '_ Model Aggressiveness β' | |
| var _replacement = !text ? '' : (text == 'f' ? ' Adult ' : 'Child ') | |
| svg.append('text.axis').text(labelText.replace('_', _replacement)) | |
| .at({y: height/2, dy: '.33em', dx: 10}) | |
| .st({pointerEvents: 'none'}) | |
| function updateThreshold(threshold, skipDom){ | |
| rv[key] = threshold | |
| data.forEach(d => d.threshold = threshold) | |
| mini.updateAll() | |
| rectSel.at({width: x(threshold)}) | |
| handleSel.translate(x(threshold), 0) | |
| if (skipDom) return | |
| if (key == 'threshold'){ | |
| allActiveSel.at({width: x(threshold)}) | |
| allHandleSel.translate(x(threshold), 0) | |
| } | |
| sel.rectSel.at({fill: d => d.grade > d.threshold ? lcolors.sick : lcolors.well}) | |
| sel.textSel | |
| .st({ | |
| strokeWidth: d => d.grade > d.threshold == d.isSick ? 0 : .6, | |
| }) | |
| } | |
| return updateThreshold | |
| } | |
| return rv | |
| } | |
| if (window.init) window.init() | |