filter by course and metro

average
Matthew Huntington 2 years ago
parent a32f6a438a
commit fd534c257a

@ -12,3 +12,6 @@ th, td {
padding:10px; padding:10px;
text-align: center; text-align: center;
} }
li {
display:inline;
}

@ -7,6 +7,8 @@ const parseTime = d3.timeParse("%B %e, %Y");
let instances; let instances;
let xScale, yScale; let xScale, yScale;
let highlighted = [] let highlighted = []
const courses = [];
const metros = [];
const randomColor = ()=>{ const randomColor = ()=>{
const red = Math.floor(Math.random()*128) + 64; const red = Math.floor(Math.random()*128) + 64;
@ -61,27 +63,36 @@ const renderPoints = () => {
.append('circle'); .append('circle');
d3.selectAll('circle') d3.selectAll('circle')
.attr('cy', (datum, index) => yScale(datum.ninety_day_outcomes/datum.graduates*100) ); .attr('cy', (datum, index) => yScale(datum.ninety_day_outcomes/datum.graduates*100) )
.attr('cx', (datum, index) => xScale(parseTime(datum.graduation_date)) )
d3.selectAll('circle')
.attr('cx', (datum, index) => xScale(parseTime(datum.graduation_date)) );
d3.selectAll('circle')
.attr('fill', datum => datum.color? datum.color : 'black') .attr('fill', datum => datum.color? datum.color : 'black')
.attr('r', datum => datum.color? 10 : 5) .attr('r', datum => datum.color? 10 : 5)
.style('display', (datum)=>{
d3.selectAll('circle').on('click', (event, datum) => { const instanceMetro = datum.course.split('-')[0]
const found = highlighted.find(i => i.instance_id === datum.instance_id) const instanceCourse = datum.course.split('-')[1]
if(found === undefined){
datum.color = randomColor() const metro = metros.find(m => m.metro === instanceMetro)
highlighted.push(datum) const course = courses.find(c => c.course === instanceCourse)
} else {
delete datum.color if(metro.checked && course.checked){
highlighted = highlighted.filter(i => i.instance_id != datum.instance_id) return 'block'
} } else {
renderPoints() return 'none'
renderTable() }
}); })
.on('click', (event, datum) => {
const found = highlighted.find(i => i.instance_id === datum.instance_id)
if(found === undefined){
datum.color = randomColor()
highlighted.push(datum)
} else {
delete datum.color
highlighted = highlighted.filter(i => i.instance_id != datum.instance_id)
}
renderPoints()
renderTable()
});
} }
@ -135,8 +146,47 @@ const createFormSubmissionHandler = () => {
}); });
} }
const populateMetrosCoursesCheckboxes = ()=>{
for(let instance of instances){
const segments = instance.course.split('-')
if(metros.find(m => m.metro === segments[0]) === undefined){
metros.push({ checked:true, metro: segments[0] })
}
if(courses.find(c => c.course === segments[1]) === undefined){
courses.push({ checked:true, course: segments[1] })
}
}
d3.select('#courses')
.selectAll('li')
.data(courses)
.enter()
.append('li').text(d => d.course)
.append('input').attr('type', 'checkbox')
.property('checked', d => d.checked)
.on('click', (event, datum)=>{
datum.checked = !datum.checked
renderPoints()
})
d3.select('#metros')
.selectAll('li')
.data(metros)
.enter()
.append('li').text(d => d.metro)
.append('input').attr('type', 'checkbox')
.property('checked', d => d.checked)
.on('click', (event, datum)=>{
datum.checked = !datum.checked
renderPoints()
})
}
window.onload = async ()=>{ window.onload = async ()=>{
instances = await d3.json('/instances'); instances = await d3.json('/instances');
populateMetrosCoursesCheckboxes();
setupGraph(); setupGraph();
createAxes(); createAxes();
renderPoints(); renderPoints();

@ -18,6 +18,10 @@
<dt>Y-Axis:</dt> <dt>Y-Axis:</dt>
<dd>Percentage of graduates that got a job within 90 days of graduation.</dd> <dd>Percentage of graduates that got a job within 90 days of graduation.</dd>
</dl> </dl>
<h3>Choose Metros To Display</h3>
<ul id="metros"></ul>
<h3>Choose CoursesTo Display</h3>
<ul id="courses"></ul>
<svg id="container"> <svg id="container">
<svg> <svg>
<g id="points"></g> <g id="points"></g>

Loading…
Cancel
Save