function scatterPlot() { // Private variables var margin = { top: 20, right: 20, bottom: 50, left: 100 }; var width = 960 - margin.left - margin.right; var height = 500 - margin.top - margin.bottom; var color = d3.scale.category20(); var x = function (d) { return d.x; }; var y = function (d) { return d.y; }; var radius = function (d) { return d.radius; }; var fill = function () { return "#808080"; }; var stroke = "#000000"; var strokeWidth = 2; var opacity = 0.5; var xScale = d3.scale.linear(); var yScale = d3.scale.linear(); var xAxis = d3.svg.axis().scale(xScale).orient("bottom"); var yAxis = d3.svg.axis().scale(yScale).orient("left"); var axisX = { axisClass: "x axis", titleClass: "x-label", x: function () { return width / 2; }, y: 30, dy: ".71em", textAnchor: "middle", title: "" }; var axisY = { axisClass: "y axis", titleClass: "y-label", x: function () { return -height / 2; }, y: -60, dy: ".71em", textAnchor: "middle", title: "" }; function chart(selection) { selection.each(function (data, index) { // Re-define data. Do not alter original dataset data = data.map(function (d, i) { return { x: x.call(data, d, i), y: y.call(data, d, i), radius: radius.call(data, d, i), color: fill.call(data, d, i) }; }); var 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 + ")"); xScale .domain(d3.extent(data, function (d) { return d.x; })) .range([0, width]); yScale .domain(d3.extent(data, function (d) { return d.y; })) .range([height, 0]); // Creating the x axis. svg.append("g") .attr("class", axisX.axisClass) .attr("transform", "translate(0," + height + ")") .call(xAxis) .append("text") .attr("class", axisX.titleClass) .attr("x", axisX.x) .attr("y", axisX.y) .attr("dy", axisX.dy) .style("text-anchor", axisX.textAnchor) .text(axisX.title); // Creating the y axis. svg.append("g") .attr("class", axisY.axisClass) .call(yAxis) .append("text") .attr("class", axisY.titleClass) .attr("transform", "rotate(-90)") .attr("x", axisY.x) .attr("y", axisY.y) .attr("dy", axisY.dy) .style("text-anchor", axisY.textAnchor) .text(axisY.title); // Creating clipPath - prevents circles from // being drawn outside the chart svg.append("clipPath") .attr("id", "chart-area") .append("rect") .attr("x", 0) .attr("y", 0) .attr("width", width) .attr("height", height); // Creating the bubble chart. var g = svg.append("g") .attr("class", "group") .attr("clip-path", "url(#chart-area)"); var circles = g.selectAll("circle") .data(data); // Exit circles.exit().remove(); // Enter circles.enter().append("circle") // Update circles .attr("class", "circle") .attr("r", function (d) { return d.radius; }) .attr("cx", function (d) { return xScale(d.x); }) .attr("cy", function (d) { return yScale(d.y); }) .attr("stroke", stroke) .attr("stroke-width", strokeWidth) .style("fill", function (d) { return d.color; }) .style("opacity", opacity); }); } // Public API chart.margin = function (_) { if (!arguments.length) { return margin; } margin.top = typeof _.top !== "undefined" ? _.top : margin.top; margin.right = typeof _.right !== "undefined" ? _.right : margin.right; margin.bottom = typeof _.bottom !== "undefined" ? _.bottom : margin.bottom; margin.left = typeof _.left !== "undefined" ? _.left : margin.left; return chart; }; chart.width = function (_) { if (!arguments.length) return width; width = _; return chart; }; chart.height = function (_) { if (!arguments.length) return height; height = _; return chart; }; chart.color = function (_) { if (!arguments.length) return color; color = _; return chart; }; chart.x = function (_) { if (!arguments.length) return x; x = _; return chart; }; chart.y = function (_) { if (!arguments.length) return y; y = _; return chart; }; chart.radius = function (_) { if (!arguments.length) return radius; radius = _; return chart; }; chart.stroke = function (_) { if (!arguments.length) return stroke; stroke = _; return chart; }; chart.strokeWidth = function (_) { if (!arguments.length) return strokeWidth; strokeWidth = _; return chart; }; chart.opacity = function (_) { if (!arguments.length) return opacity; opacity = _; return chart; }; chart.fill = function (_) { if (!arguments.length) return fill; fill = _; return chart; }; chart.axisX = function (_) { if (!arguments.length) { return axisX; } axisX.axisClass = typeof _.axisClass !== "undefined" ? _.axisClass : axisX.axisClass; axisX.titleClass = typeof _.titleClass !== "undefined" ? _.titleClass : axisX.titleClass; axisX.x = typeof _.x !== "undefined" ? _.x : axisX.x; axisX.y = typeof _.y !== "undefined" ? _.y : axisX.y; axisX.dy = typeof _.dy !== "undefined" ? _.dy : axisX.dy; axisX.textAnchor = typeof _.textAnchor !== "undefined" ? _.textAnchor : axisX.textAnchor; axisX.title = typeof _.title !== "undefined" ? _.title : axisX.title; return chart; }; chart.axisY = function (_) { if (!arguments.length) { return axisY; } axisY.axisClass = typeof _.axisClass !== "undefined" ? _.axisClass : axisY.axisClass; axisY.titleClass = typeof _.titleClass !== "undefined" ? _.titleClass : axisY.titleClass; axisY.x = typeof _.x !== "undefined" ? _.x : axisY.x; axisY.y = typeof _.y !== "undefined" ? _.y : axisY.y; axisY.dy = typeof _.dy !== "undefined" ? _.dy : axisY.dy; axisY.textAnchor = typeof _.textAnchor !== "undefined" ? _.textAnchor : axisY.textAnchor; axisY.title = typeof _.title !== "undefined" ? _.title : axisY.title; return chart; }; return chart; }