Skip to content

Instantly share code, notes, and snippets.

@blech
Forked from threestory/cb_2014_us_county_5m.json
Last active November 9, 2018 22:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blech/4111bed70605fb1ed594d969320a87da to your computer and use it in GitHub Desktop.
Save blech/4111bed70605fb1ed594d969320a87da to your computer and use it in GitHub Desktop.
California Votes - Prop 6, Nov 2018
---
height: 800
scrolling: no
border: no
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>California Votes: Mercator projection</title>
<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
<script src="https://d3js.org/d3-scale.v2.min.js"></script>
<style type="text/css">
body {
margin: 0;
background-color: #ffffff;
font-family: sans-serif;
}
#container {
width: 800px;
margin-left: 0px;
margin-right: auto;
margin-top: 0px;
padding: 30px;
background-color: white;
}
h1 {
font-size: 24px;
margin: 0;
}
p {
font-size: 16px;
margin: 15px 0 10px 0;
}
a {
color: #799DCB;
text-decoration: none;
transition: color .3s, background .3s, border .3s;
}
a:hover {
color: #48494b;
background: #e7e8e9;
}
svg {
background-color: white;
padding-left: 20px;
}
path {
stroke: #000;
}
path:hover {
/*fill:#48494b;*/
cursor:pointer;
}
#tooltip {
width: 150px;
height: auto;
padding: 5px;
background-color: #fff;
color: #000;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.4);
-moz-box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.4);
box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.4);
pointer-events: none;
position: absolute;
}
#tooltip.hidden {
display: none;
}
#tooltip p {
margin: 0;
font-size: 14px;
line-height: 18px;
}
</style>
</head>
<body>
<body>
<div id="container">
<h1>Votes on Prop 6</h1>
<p>Sources: <a href="https://www.census.gov/geo/maps-data/data/cbf/cbf_counties.html" target="new">U.S. Census Bureau</a>,
<a href="https://vote.sos.ca.gov/returns/maps/ballot-measures/prop/6" target="new">California Secretary of State</a>
</p>
<p>Red is no, blue is yes</p>
</div>
<div id="tooltip" class="hidden">
<p>County: <span id="county">County Name</span></p>
</div>
<script type="text/javascript">
//Width and height
var w = 760;
var h = 600;
//Define map projection
var projection = d3.geo.mercator()
.center([ -120, 37 ])
.translate([ w/2, h/2 ])
.scale([ w*3.3 ]);
//Define path generator
var path = d3.geo.path()
.projection(projection);
//Create SVG
var svg = d3.select("#container")
.append("svg")
.attr("width", w)
.attr("height", h);
// color scale
var colors = d3.scaleLinear()
.domain([15, 85])
.range(["#ff0000", "#0000ff"]);
//This is very un-d3-ish because I can't wrap my head around it today, evidently
max_yes = 800000;
max_total = 2000000;
//Load in GeoJSON data
d3.json("https://gist.githubusercontent.com/threestory/ed0f322d7bb2e3be8ded/raw/2aa8df2f15817985c60b67d726e6d13197e8ffb6/cb_2014_us_county_5m.json", function(geojson) {
//Get votes
d3.json("https://api.sos.ca.gov/returns/maps/ballot-measures/prop/6", function(votes) {
//Bind data and create one path per GeoJSON feature
svg.selectAll("path")
.data(geojson.features)
.enter()
.append("path")
.attr("d", path)
.attr('fill', function(d) {
color = "#f0f0f0";
county_name = d.properties.NAME.toLowerCase();
county_name = county_name.replace(/ /g, '-');
counties = d3.keys(votes);
counties.forEach(function(k, i) {
if (k == county_name) {
yes = parseFloat(votes[k]['ballot-measures'][0]['yesPercent']);
color = colors(yes);
}
});
return color;
})
.on("mouseover", function(d){
var xPosition = w/2 + 150;
var yPosition = h/2;
// var xPosition = parseFloat(path.centroid(this).attr("cx"));
// var yPosition = parseFloat(path.centroid(this).attr("cy"));
d3.select("#tooltip")
.style("left", xPosition + "px")
.style("top", yPosition + "px");
d3.select("#county")
.text(d.properties.NAME);
d3.select("#tooltip")
.classed("hidden", false);
})
.on("mouseout", function(){
d3.select("#tooltip").classed("hidden", true);
})
.style("opacity", function(d) {
county_name = d.properties.NAME.toLowerCase();
county_name = county_name.replace(/ /g, '-');
counties = d3.keys(votes);
counties.forEach(function(k, i) {
if (k == county_name) {
yes_votes = parseInt(votes[k]['ballot-measures'][0]['yesVotes']);
no_votes = parseInt(votes[k]['ballot-measures'][0]['noVotes']);
opacity = (yes_votes+no_votes)*1.0/max_total;
// leaving this in but it produces really weird maps,
// so I'm hardcoding it anyway \o/
}
});
return 1.0;
});
});
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment