140 lines
3.4 KiB
JavaScript
140 lines
3.4 KiB
JavaScript
// Dimensions of chart.
|
|
let margin = { top: 20, right: 30, bottom: 50, left: 55 },
|
|
// width = parseInt(d3.select('#chart').style('width'), 10) - margin.left - margin.right,
|
|
width = 600 - margin.left - margin.right,
|
|
// height = width/.8 - margin.top - margin.bottom;
|
|
height = width - margin.top - margin.bottom;
|
|
|
|
let svg = d3.select("#chart").append("svg")
|
|
.attr("width", width + margin.left + margin.right)
|
|
.attr("height", height + margin.top + margin.bottom)
|
|
.append("g")
|
|
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
|
|
|
// Scales: x and y and r
|
|
let x = d3.scaleLinear()
|
|
// .domain([3, 6])
|
|
.domain([4, 6])
|
|
.range([0, width]);
|
|
let y = d3.scaleLinear()
|
|
// .domain([2, 6])
|
|
.domain([3, 6])
|
|
.range([height, 0]);
|
|
let r = d3.scaleSqrt()
|
|
.domain([0, 10])
|
|
.range([0, 25]);
|
|
|
|
// Point color
|
|
let ptcolor = "#5a8171";
|
|
|
|
|
|
|
|
// x-axis
|
|
let xAxis = d3.axisBottom(x)
|
|
// .ticks(7)
|
|
.ticks(4)
|
|
.tickSize(-height-8)
|
|
.tickPadding(5);
|
|
let xAxisEl = svg.append("g")
|
|
.attr("class", "x axis bottom")
|
|
.attr("transform", "translate(0,"+(height+8)+")");
|
|
xAxisEl.append("text")
|
|
.attr("class", "axistitle")
|
|
.attr("text-anchor", "start")
|
|
.attr("x", 0).attr("y", 0)
|
|
// .attr("dx", "-.25em")
|
|
.attr("dx", "-.8em")
|
|
.attr("dy", "2.5em")
|
|
.text("Meaningfulness Score Average");
|
|
xAxisEl.call(xAxis);
|
|
|
|
|
|
// y-axis
|
|
let yAxis = d3.axisLeft(y)
|
|
// .ticks(7)
|
|
.ticks(5)
|
|
.tickSize(-width-8)
|
|
.tickPadding(5);
|
|
let yAxisEl = svg.append("g")
|
|
.attr("class", "y axis left")
|
|
.attr("transform", "translate("+(-8)+",0)");
|
|
yAxisEl.append("text")
|
|
.attr("class", "axistitle")
|
|
.attr("x", 0).attr("y", 0)
|
|
.attr("dx", "4px")
|
|
// .attr("dy", "-2em")
|
|
.attr("dy", "-3em")
|
|
.style("text-anchor", "end")
|
|
.attr("transform", "rotate(-90)")
|
|
.text("Happiness Score Average");
|
|
yAxisEl.call(yAxis);
|
|
|
|
|
|
let activities;
|
|
let circle, labeltext;
|
|
|
|
// Load data
|
|
const activitiesData = Promise.all([
|
|
d3.tsv("data/act_means.tsv", d3.autoType)
|
|
]);
|
|
activitiesData.then(function(data) {
|
|
|
|
activities = data[0].sort((a, b) => b.relwt - a.relwt);
|
|
console.log(activities);
|
|
|
|
// Initialize chart now that data is loaded.
|
|
initChart();
|
|
});
|
|
|
|
|
|
function initChart() {
|
|
// Circle for each node.
|
|
circle = svg.append("g")
|
|
.selectAll("circle")
|
|
.data(activities)
|
|
.join("circle")
|
|
.attr("id", d => "circle"+d.activity)
|
|
.attr("cx", d => x(d.meaning_mean))
|
|
.attr("cy", d => y(d.schappy_mean))
|
|
.attr("fill", ptcolor)
|
|
.attr("fill-opacity", .75)
|
|
.attr("r", d => r(d.relwt))
|
|
.attr("stroke", "#fff")
|
|
.attr("stroke-width", ".5px");
|
|
|
|
setInteraction();
|
|
}
|
|
|
|
|
|
|
|
function setInteraction() {
|
|
|
|
// Create label
|
|
labeltext = svg.append("text")
|
|
.attr("text-anchor", "middle");
|
|
|
|
// Hover events
|
|
circle.on("mouseover", function(e,d) {
|
|
d3.selectAll(".current").classed("current", false);
|
|
d3.select(this).classed("current", true);
|
|
|
|
let curract = d3.select(this).datum();
|
|
|
|
labeltext.text(curract.descrip)
|
|
.attr("x", x(curract.meaning_mean))
|
|
.attr("y", y(curract.schappy_mean)-r(curract.relwt)-5);
|
|
})
|
|
// .on("mousemove", function(e,d) {
|
|
// d3.select(this).classed("current", true);
|
|
// })
|
|
.on('mouseout', function(d) {
|
|
d3.select(this).classed('current', false);
|
|
labeltext.text('');
|
|
}); // @end mouseover
|
|
|
|
}
|
|
|
|
|
|
|
|
|