-
-
Save michellechandra/0b2ce4923dc9b5809922 to your computer and use it in GitHub Desktop.
| years | place | lat | lon | |
|---|---|---|---|---|
| 2 | New York City | 40.71455 | -74.007124 | |
| 6 | San Francisco | 37.7771187 | -122.4196396 | |
| 8 | Santa Cruz | 36.9740181 | -122.0309525 | |
| 3 | Santa Barbara | 34.4193802 | -119.6990509 | |
| 10 | Tucson | 32.22155 | -110.9697571 | |
| 1 | Washington DC | 38.8903694 | -77.0319595 |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>Oh the Place's You'll Go!</title> | |
| <script src="http://d3js.org/d3.v3.min.js"></script> | |
| <style type="text/css"> | |
| /* On mouse hover, lighten state color */ | |
| path:hover { | |
| fill-opacity: .7; | |
| } | |
| /* Style for Custom Tooltip */ | |
| div.tooltip { | |
| position: absolute; | |
| text-align: center; | |
| width: 60px; | |
| height: 28px; | |
| padding: 2px; | |
| font: 12px sans-serif; | |
| background: white; | |
| border: 0px; | |
| border-radius: 8px; | |
| pointer-events: none; | |
| } | |
| /* Legend Font Style */ | |
| body { | |
| font: 11px sans-serif; | |
| } | |
| /* Legend Position Style */ | |
| .legend { | |
| position:absolute; | |
| left:800px; | |
| top:350px; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <script type="text/javascript"> | |
| /* This visualization was made possible by modifying code provided by: | |
| Scott Murray, Choropleth example from "Interactive Data Visualization for the Web" | |
| https://github.com/alignedleft/d3-book/blob/master/chapter_12/05_choropleth.html | |
| Malcolm Maclean, tooltips example tutorial | |
| http://www.d3noob.org/2013/01/adding-tooltips-to-d3js-graph.html | |
| Mike Bostock, Pie Chart Legend | |
| http://bl.ocks.org/mbostock/3888852 */ | |
| //Width and height of map | |
| var w = 960; | |
| var h = 600; | |
| // D3 Projection | |
| var projection = d3.geo.albersUsa() | |
| .translate([w/2, h/2]) // translate to center of screen | |
| .scale([1000]); // scale things down so see entire US | |
| // Define path generator | |
| var path = d3.geo.path() // path generator that will convert GeoJSON to SVG paths | |
| .projection(projection); // tell path generator to use albersUsa projection | |
| // Define linear scale for output | |
| var color = d3.scale.linear() | |
| .range(["rgb(213,222,217)","rgb(69,173,168)","rgb(84,36,55)","rgb(217,91,67)"]); | |
| var legendText = ["Cities Lived", "States Lived", "States Visited", "Nada"]; | |
| //Create SVG element and append map to the SVG | |
| var svg = d3.select("body") | |
| .append("svg") | |
| .attr("width", w) | |
| .attr("height", h); | |
| // Append Div for tooltip to SVG | |
| var div = d3.select("body") | |
| .append("div") | |
| .attr("class", "tooltip") | |
| .style("opacity", 0); | |
| // Load in my states data! | |
| d3.csv("stateslived.csv", function(data) { | |
| color.domain([0,1,2,3]); // setting the range of the input data | |
| // Load GeoJSON data and merge with states data | |
| d3.json("us-states.json", function(json) { | |
| // Loop through each state data value in the .csv file | |
| for (var i = 0; i < data.length; i++) { | |
| // Grab State Name | |
| var dataState = data[i].state; | |
| // Grab data value | |
| var dataValue = data[i].visited; | |
| // Find the corresponding state inside the GeoJSON | |
| for (var j = 0; j < json.features.length; j++) { | |
| var jsonState = json.features[j].properties.name; | |
| if (dataState == jsonState) { | |
| // Copy the data value into the JSON | |
| json.features[j].properties.visited = dataValue; | |
| // Stop looking through the JSON | |
| break; | |
| } | |
| } | |
| } | |
| // Bind the data to the SVG and create one path per GeoJSON feature | |
| svg.selectAll("path") | |
| .data(json.features) | |
| .enter() | |
| .append("path") | |
| .attr("d", path) | |
| .style("stroke", "#fff") | |
| .style("stroke-width", "1") | |
| .style("fill", function(d) { | |
| // Get data value | |
| var value = d.properties.visited; | |
| if (value) { | |
| //If value exists… | |
| return color(value); | |
| } else { | |
| //If value is undefined… | |
| return "rgb(213,222,217)"; | |
| } | |
| }); | |
| // Map the cities I have lived in! | |
| d3.csv("cities-lived.csv", function(data) { | |
| svg.selectAll("circle") | |
| .data(data) | |
| .enter() | |
| .append("circle") | |
| .attr("cx", function(d) { | |
| return projection([d.lon, d.lat])[0]; | |
| }) | |
| .attr("cy", function(d) { | |
| return projection([d.lon, d.lat])[1]; | |
| }) | |
| .attr("r", function(d) { | |
| return Math.sqrt(d.years) * 4; | |
| }) | |
| .style("fill", "rgb(217,91,67)") | |
| .style("opacity", 0.85) | |
| // Modification of custom tooltip code provided by Malcolm Maclean, "D3 Tips and Tricks" | |
| // http://www.d3noob.org/2013/01/adding-tooltips-to-d3js-graph.html | |
| .on("mouseover", function(d) { | |
| div.transition() | |
| .duration(200) | |
| .style("opacity", .9); | |
| div.text(d.place) | |
| .style("left", (d3.event.pageX) + "px") | |
| .style("top", (d3.event.pageY - 28) + "px"); | |
| }) | |
| // fade out tooltip on mouse out | |
| .on("mouseout", function(d) { | |
| div.transition() | |
| .duration(500) | |
| .style("opacity", 0); | |
| }); | |
| }); | |
| // Modified Legend Code from Mike Bostock: http://bl.ocks.org/mbostock/3888852 | |
| var legend = d3.select("body").append("svg") | |
| .attr("class", "legend") | |
| .attr("width", 140) | |
| .attr("height", 200) | |
| .selectAll("g") | |
| .data(color.domain().slice().reverse()) | |
| .enter() | |
| .append("g") | |
| .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; }); | |
| legend.append("rect") | |
| .attr("width", 18) | |
| .attr("height", 18) | |
| .style("fill", color); | |
| legend.append("text") | |
| .data(legendText) | |
| .attr("x", 24) | |
| .attr("y", 9) | |
| .attr("dy", ".35em") | |
| .text(function(d) { return d; }); | |
| }); | |
| }); | |
| </script> | |
| </body> | |
| </html> |
| state | visited | |
|---|---|---|
| Alabama | 0 | |
| Alaska | 0 | |
| Arkansas | 0 | |
| Arizona | 2 | |
| California | 2 | |
| Colorado | 1 | |
| Connecticut | 1 | |
| Delaware | 0 | |
| Florida | 0 | |
| Georgia | 0 | |
| Hawaii | 0 | |
| Iowa | 0 | |
| Idaho | 1 | |
| Illinois | 1 | |
| Indiana | 0 | |
| Kansas | 0 | |
| Kentucky | 0 | |
| Louisiana | 0 | |
| Maine | 1 | |
| Maryland | 1 | |
| Massachusetts | 1 | |
| Michigan | 0 | |
| Minnesota | 1 | |
| Missouri | 0 | |
| Mississippi | 0 | |
| Montana | 1 | |
| North Carolina | 0 | |
| North Dakota | 0 | |
| Nebraska | 0 | |
| New Hampshire | 1 | |
| New Jersey | 0 | |
| New Mexico | 1 | |
| Nevada | 1 | |
| New York | 2 | |
| Ohio | 1 | |
| Oklahoma | 0 | |
| Oregon | 1 | |
| Pennsylvania | 1 | |
| Rhode Island | 1 | |
| South Carolina | 0 | |
| South Dakota | 0 | |
| Tennessee | 0 | |
| Texas | 0 | |
| Utah | 1 | |
| Virginia | 0 | |
| Vermont | 0 | |
| Washington | 1 | |
| Wisconsin | 0 | |
| West Virginia | 0 | |
| Wyoming | 1 |
@michellechandra Thank you as well for your informative code! I, too, am wondering if you'd be willing to let me license your code.
@michellechandra Thank you for this beautiful D3 example! Would it be okay to modify and re-use as an example for high school students? I mostly work with p5.js, but this would be a lovely intro into D3.
ps Just saw your website. I'm a huge Susan Sontag fan. We both went to North Hollywood High. Huge fan of Dan Shiffman of NYU as well.
@georgesb - sure, no problem! very cool you went to high school with Susan Sontag!
Thank you, Michelle! I’ll enjoy learning some D3 with your project! I’m a bit younger than Susan Sontag. 20 years to be exact. She would be 87 now if she were alive. So I never actually met her, but I got into reading her when I was quite young and it was exciting to learn later that she and I had attended the same high school. I'm a semi-retired LAUSD educator and I like to bring in literature and the arts in my CS classes. My website: https://georgesb.com Thanks again!
This is awesome! I was doing a POC on US maps charts and came across your code. I am using ReactJS in AWS-Amplify and some d3 functions are either renamed/moved or not applicable. Managed to get it working, thanks for this.
@michellechandra Thank you for writing such informative code! I found this originally at http://bl.ocks.org/michellechandra/0b2ce4923dc9b5809922 and it has been a big help in getting me acquainted with D3.
I was wondering if you'd be willing to let me license your code, I am working on some projects for my job and would love to use your methods. Let me know if you would like more details!