<!DOCTYPE html> <meta charset="utf-8"> <style> circle.dot { fill: steelblue; } .axis text { font: 10px sans-serif; } .axis path, .axis line { fill: none; stroke: #000; shape-rendering: crispEdges; } </style> <body> <script src="http://d3js.org/d3.v2.js"></script> <script> var data = [ ]; var margin = {top: 40, right: 40, bottom: 40, left: 40}, width = 960, height = 500; var x = pad(d3.scale.linear() .domain([0, 1]) .range([0, width - margin.left - margin.right]), 40); var y = pad(d3.scale.linear() .domain([0, 1]) .range([height - margin.top - margin.bottom, 0]), 40); var xAxis = d3.svg.axis() .scale(x) .orient("bottom") .tickPadding(8); var yAxis = d3.svg.axis() .scale(y) .orient("left") .tickPadding(8); var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height) .attr("class", "dot chart") .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var dots = svg.selectAll(".dot") .data(data) .enter().append("circle") .attr("class", "dot") .attr("cx", function(d) { return x(d[0]); }) .attr("cy", function(d) { return y(d[1]); }) .attr("r", 12); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + y.range()[0] + ")") .call(xAxis); svg.append("g") .attr("class", "y axis") .call(yAxis); function pad(scale, k) { var range = scale.range(); if (range[0] > range[1]) k *= -1; return scale.domain([range[0] - k, range[1] + k].map(scale.invert)).nice(); } function update() { svg.selectAll(".dot").data(data).enter().append("circle") .attr("class", "dot") .attr("cx", function(d) { return x(d[0]); }) .attr("cy", function(d) { return y(d[1]); }) .attr("r", 12); } </script> </body>