D3
OG
Old school D3 from simpler times
All examples
By author
By category
About
arnicas
Full window
Github gist
Dot plot example
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Adding Labels</title> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script> <style type="text/css"> body { background-color: #ddddff; font-family: sans-serif; } h3 { margin-left: 200px; } p { margin-left: 200px; font-size: 11pt; color: gray; } div.y2015 { color: #6699FF; display: inline; } div.y1990 { color: orange; display: inline; } svg { background-color: white; } circle { stroke-width: 1; } circle.y2015 { fill: #6699FF; } circle.y1990 { fill: orange; } circle:hover { stroke-width: 3; stroke: white; } line.grid { stroke: #eee; } line.between { stroke: black; } .axis path, .axis line { fill: none; stroke: black; shape-rendering: crispEdges; } .axis text { font-family: sans-serif; font-size: 11px; } .xlabel { font-famile: sans-serif; font-size: 11px; color: gray; } </style> </head> <body> <h3>Access to Good Water Sources by World Region, <div class="y1990">1990</div> versus <div class="y2015">2015</div></h3> <p>Source: WHO/UNICEF data, 2015. <script type="text/javascript"> // this is the size of the svg container -- the white part var fullwidth = 1000, fullheight = 500; // these are the margins around the graph. Axes labels go in margins. var margin = {top: 20, right: 25, bottom: 20, left: 200}; var width = 1000 - margin.left - margin.right, height = 500 - margin.top - margin.bottom; var widthScale = d3.scale.linear() .range([ 0, width]); var heightScale = d3.scale.ordinal() .rangeRoundBands([ margin.top, height], 0.2); var xAxis = d3.svg.axis() .scale(widthScale) .orient("bottom"); var yAxis = d3.svg.axis() .scale(heightScale) .orient("left") .innerTickSize([0]); var svg = d3.select("body") .append("svg") .attr("width", fullwidth) .attr("height", fullheight); d3.csv("water_improvement_data.csv", function(error, data) { if (error) { console.log("error reading file"); } data.sort(function(a, b) { return d3.descending(+a.year2015, +b.year2015); }); // in this case, i know it's out of 100 because it's percents. widthScale.domain([0, 100]); // js map: will make a new array out of all the d.name fields heightScale.domain(data.map(function(d) { return d.name; } )); // Make the faint lines from y labels to highest dot var linesGrid = svg.selectAll("lines.grid") .data(data) .enter() .append("line"); linesGrid.attr("class", "grid") .attr("x1", margin.left) .attr("y1", function(d) { return heightScale(d.name) + heightScale.rangeBand()/2; }) .attr("x2", function(d) { return margin.left + widthScale(+d.year2015); }) .attr("y2", function(d) { return heightScale(d.name) + heightScale.rangeBand()/2; }); // Make the dotted lines between the dots var linesBetween = svg.selectAll("lines.between") .data(data) .enter() .append("line"); linesBetween.attr("class", "between") .attr("x1", function(d) { return margin.left + widthScale(+d.year1990); }) .attr("y1", function(d) { return heightScale(d.name) + heightScale.rangeBand()/2; }) .attr("x2", function(d) { return margin.left + widthScale(d.year2015); }) .attr("y2", function(d) { return heightScale(d.name) + heightScale.rangeBand()/2; }) .attr("stroke-dasharray", "5,5") .attr("stroke-width", function(d, i) { if (i == 7) { return "1"; } else { return "0.5"; } }); // Make the dots for 1990 var dots1990 = svg.selectAll("circle.y1990") .data(data) .enter() .append("circle"); dots1990 .attr("class", "y1990") .attr("cx", function(d) { return margin.left + widthScale(+d.year1990); }) .attr("r", heightScale.rangeBand()/2) .attr("cy", function(d) { return heightScale(d.name) + heightScale.rangeBand()/2; }) .style("stroke", function(d){ if (d.name === "The World") { return "black"; } }) .style("fill", function(d){ if (d.name === "The World") { return "darkorange"; } }) .append("title") .text(function(d) { return d.name + " in 1990: " + d.year1990 + "%"; }); // Make the dots for 2015 var dots2015 = svg.selectAll("circle.y2015") .data(data) .enter() .append("circle"); dots2015 .attr("class", "y2015") .attr("cx", function(d) { return margin.left + widthScale(+d.year2015); }) .attr("r", heightScale.rangeBand()/2) .attr("cy", function(d) { return heightScale(d.name) + heightScale.rangeBand()/2; }) .style("stroke", function(d){ if (d.name === "The World") { return "black"; } }) .style("fill", function(d){ if (d.name === "The World") { return "#476BB2"; } }) .append("title") .text(function(d) { return d.name + " in 2015: " + d.year2015 + "%"; }); // add the axes svg.append("g") .attr("class", "x axis") .attr("transform", "translate(" + margin.left + "," + height + ")") .call(xAxis); svg.append("g") .attr("class", "y axis") .attr("transform", "translate(" + margin.left + ",0)") .call(yAxis); svg.append("text") .attr("class", "xlabel") .attr("transform", "translate(" + (margin.left + width / 2) + " ," + (height + margin.bottom) + ")") .style("text-anchor", "middle") .attr("dy", "12") .text("Percent"); // Style one of the Y labels bold: // a hack that works if you can unravel the selections - to style "The World" bold in the axis label, which is the 8th element: var allYAxisLabels = d3.selectAll("g.y.axis g.tick text")[0]; // un-nest array d3.select(allYAxisLabels[7]).style("font-weight", "bold"); // You could also use tick formatting to get a % sign on each axis tick }); </script> </body> </html>
https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js