{
const data = await FileAttachment('penguins.csv').csv({typed: true});
const yAccessor = d => d.body_mass_g;
const xAccessor = d => d.flipper_length_mm;
const dimensions = {
width: width,
height: 400,
margin: {
top: 20,
right: 20,
bottom: 20,
left: 20,
}
};
dimensions.innerWidth = dimensions.width
- dimensions.margin.left
- dimensions.margin.right;
dimensions.innerHeight = dimensions.height
- dimensions.margin.top
- dimensions.margin.bottom;
const xScale = d3.scaleLinear()
.domain(d3.extent(data, xAccessor)).nice()
.range([0, dimensions.innerWidth]);
const yScale = d3.scaleLinear()
.domain(d3.extent(data, yAccessor)).nice()
.range([dimensions.innerHeight, 0]);
const wrapper = d3.create('svg')
.attr('viewBox', [0, 0, dimensions.width, dimensions.height]);
const chart = wrapper.append('g')
.style('transform', `translate(${dimensions.margin.left}px, ${dimensions.margin.top}px)`);
chart.append('g')
.selectAll('circle')
.data(data)
.join('circle')
.filter(d => d.body_mass_g)
.attr('cx', d => xScale(xAccessor(d)))
.attr('cy', d => yScale(yAccessor(d)))
.attr('r', 5)
.attr('fill', 'lightblue');
const xAxisGenerator = d3.axisBottom().scale(xScale);
const yAxisGenerator = d3.axisLeft().scale(yScale);
const xAxis = chart.append('g').call(xAxisGenerator)
.style('transform', `translateY(${dimensions.innerHeight}px)`)
const yAxis = chart.append('g').call(yAxisGenerator);
return wrapper.node();
}