chart = {
var margin = {top: 5, right: 100, bottom: 50, left: 50};
var data = penguinsNoNan;
var svg = d3.create("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom);
var g = svg.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var yScale = d3.scaleLinear()
.domain(d3.extent(data, d => d.culmen_length_mm))
.range([height, 0]);
var rScale = d3.scaleLinear()
.domain(d3.extent(data, d => d.body_mass_g))
.range([0, 10]);
var islandCat = Array.from(d3.group(data, d => d.island)).map(d => d[0])
var colorScale = d3.scaleOrdinal()
.domain(islandCat)
.range(d3.schemeTableau10)
// Draw the x axis
g.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(xScale))
// Add x title
g.append("text")
.attr("text-anchor", "middle")
.attr("alignment-baseline", "after-edge")
.attr("x", width/2)
.attr("y", height + margin.bottom)
.text("culmen_depth_mm");
// Draw the y axis
g.append("g")
.call(d3.axisLeft(yScale))
// Add y title
g.append("text")
.attr("text-anchor", "middle")
.attr("alignment-baseline", "hanging")
.attr("transform", "rotate(-90)")
.attr("x", -height/2)
.attr("y", -margin.left)
.text("culmen_length_mm");
// Draw colour legend
var colourLegend = g.selectAll(".colourLegend")
.data(islandCat)
.enter()
.append("g")
.attr("class", "colourLegend")
.attr("transform", (d, i) => ("translate(" + (width + 20) + "," + (margin.top + i*18) + ")"))
colourLegend.append("circle")
.attr("r", 5)
.attr("fill", d => colorScale(d))
colourLegend.append("text")
.attr("transform", "translate(15,0)")
.attr("alignment-baseline", "middle")
.text(d => d)
// Draw size legend
var sizeLegend = g.append("g")
.attr("transform", (d, i) => ("translate(" + (width + 20) + "," + (margin.top + 4*18) + ")"))
sizeLegend.append("circle")
.attr("r", 1)
sizeLegend.append("text")
.attr("transform", "translate(15,0)")
.attr("alignment-baseline", "middle")
.text(d3.min(data, d => d.body_mass_g) + " g")
sizeLegend.append("circle")
.attr("transform", "translate(0,18)")
.attr("r", 10)
sizeLegend.append("text")
.attr("transform", "translate(15,18)")
.attr("alignment-baseline", "middle")
.text(d3.max(data, d => d.body_mass_g) + " g")
// Draw a circle for each datum
g.selectAll(".point")
.data(data)
.enter()
.append("circle")
.attr("class", "point")
.attr("cx", d => xScale(d.culmen_depth_mm))
.attr("cy", d => yScale(d.culmen_length_mm))
.attr("r", d => rScale(d.body_mass_g))
.attr("fill", d => colorScale(d.island))
.on("mouseover", (event, d) => onMouseOver(event, d))
.on("mouseout", onMouseOut)
var tooltip = d3.select("body").append("div")
.style("display", "none")
.style("position", "absolute")
.style("background-color", "#FFFA")
function onMouseOver(event, d) {
var mouse = d3.pointer(event, d3.select("body").node())
tooltip.style("display", null)
.style("left", (mouse[0] + 20) + "px")
.style("top", (mouse[1] + 20) + "px")
.html(d.sex)
}
function onMouseOut() {
tooltip.style("display", "none");
}
// DIFFERENT FROM HOMEMADE WEBSITE
return svg.node();
}