block by majomo 0d7c0ae12a48bbc4d8a1

Map circles text

Full Screen

forked from alignedleft‘s block: Map circles text

index.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<script type="text/javascript" src="//d3js.org/d3.v3.min.js"></script>
	<link href='https://fonts.googleapis.com/css?family=Lato:400,100,300,400italic,900,700,100italic,300italic,700italic,900italic&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
	<link rel="stylesheet" type="text/css" href="main.css">
	<title>Voivodeships of Poland</title>
</head>

<body>

<div id="wrapper">
	
	<div class="text">
		<h1>Voivodeships of Poland</h1>
	</div>

	<script type="text/javascript">

	d3.select("div", "#wrapper")
				.append("div")
				.attr("id", "content");

	var margin = {top: 5, right: 25, bottom: 5, left: 5};

	var width = 900 - margin.left - margin.right,
    	height = 750 - margin.top - margin.bottom;


    var projection = d3.geo.mercator()
					.center([22, 51])
					.translate([ width/2, height/2 ])
					.scale(3000);


	var path = d3.geo.path()
					.projection(projection);

	var mapColor = d3.scale.quantize()
							.range(["#ffffb2", 
									"#fed98e", 
									"#fe9929", 
									"#d95f0e", 
									"#993404"])
							.domain([7, 16.5]);

	var legendColor = ["#ffffb2", "#fed98e", "#fe9929", "#d95f0e", "#993404"];


	var svg = d3.select("#content")
				.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 + ")");

    var formatNumbers =  d3.format(",");



    d3.csv("woj_stats.csv", function(data) {
			
			
    d3.json("woj_maps.json", function(json) {

    	for (var i = 0; i < data.length; i++) {
				
						var dataWoj = data[i].woj;
						
						
						var areaWoj = parseFloat(data[i].area);
						
						var populationWoj = parseFloat(data[i].population);
						
						var densityWoj = parseFloat(data[i].density);
						
						var unRateWoj = parseFloat(data[i].un_rate_woj);
						
						var capitalWoj = data[i].capital;
						
						var capitalWojUR = parseFloat(data[i].un_rate_capital);

						var capitalLong = parseFloat(data[i].longitude);

						var capitalLat = parseFloat(data[i].latitude);

												
						for (var j = 0; j < json.features.length; j++) {
						
							var jsonWoj = json.features[j].properties.name;
				
							if (dataWoj == jsonWoj) {
						
								json.features[j].properties.area = areaWoj;
								json.features[j].properties.population = populationWoj;
								json.features[j].properties.density = densityWoj;
								json.features[j].properties.un_rate_woj = unRateWoj;
								json.features[j].properties.capital = capitalWoj;
								json.features[j].properties.capitalWojUR = capitalWojUR;
								
								json.features[j].properties.longitude = capitalLong;
								
								json.features[j].properties.latitude = capitalLat;

								break;
								
							}
						}		
					}



    	var mapWoj = svg.selectAll("g")
                    .data(json.features)
                    .enter()
                    .append("g")

		mapWoj.append("path")
				   .attr("d", path)
				   .attr("class", "path")
				   .style("fill", function (d) { return mapColor(d.properties.un_rate_woj);
				   });

		

		mapWoj.append("text")
				.attr("x", 550)
				.attr("y", 100)
				.attr("text-anchor", "start")
				.attr("fill", "none")
				.text(function(d) { return d.properties.name; })
				
				.append("tspan")
				.attr("x", 550)
				.attr("dy", 25)
				.text(function(d) { return "Area: " + formatNumbers(d.properties.area) + " sq. km"; })
				
				.append("tspan")
				.attr("x", 550)
				.attr("dy", 25)
				.text(function(d) { return "Population: " + formatNumbers(d.properties.population); })
				
				.append("tspan")
				.attr("x", 550)
				.attr("dy", 25)
				.text(function(d) { return "Unemployment rate: " + d.properties.un_rate_woj + "%"; })
				
				.append("tspan")
				.attr("x", 550)
				.attr("dy", 25)
				.text(function(d) { return "Capital: " + d.properties.capital ; })

				.append("tspan")
				.attr("x", 550)
				.attr("dy", 25)
				.text(function(d) { return d.properties.capital + "'s unemployment rate: " + d.properties.capitalWojUR + "%"; });
				
		
		mapWoj.on("mouseover", function() { 
                    d3.select(this)
                    .classed("hover", true)
                });
                
        mapWoj.on("mouseout", function() { 
            	d3.select(this)
                .classed("hover", false)
        		});


        //Create a new group for each capital
       var mapCapitalGroups = svg.selectAll("g.capital")
                    .data(json.features)
                    .enter()
                    .append("g")
                    .attr("class", "capital");

       //Within each group, append a circle
       mapCapitalGroups.append("circle")
       				.attr("cx", function(d) {
				  		 return projection([d.properties.longitude, d.properties.latitude])[0];
				   	 })
                    .attr("cy", function(d) {
				  		return projection([d.properties.longitude, d.properties.latitude])[1];
				  	    	 })
					.attr("r", function(d) { return Math.sqrt(+d.properties.capitalWojUR * 50);
					   });

		//Within each group, append a text element
		//oh, and stores a reference to these text elements
		//in a new variable, because we'll need this for appending
		//tspans inside each one in a moment.
		var capitalLabels = mapCapitalGroups.append("text")
					.attr("x", 550)
					.attr("y", 100)
					.attr("text-anchor", "start")
					.attr("fill", "none")
					.text(function(d) { return d.properties.capital; });

		//Append a new tspan inside of each element…
		capitalLabels.append("tspan")
					.attr("x", 550)
					.attr("dy", 25)
					.text(function(d) { return "Unemployment rate: " + d.properties.capitalWojUR + "%"; });

		//Append another new tspan inside of each element…
		capitalLabels.append("tspan")
					.attr("x", 550)
					.attr("dy", 25)
					.text(function(d) { return d.properties.name + "'s nemployment rate: " + d.properties.un_rate_woj; });


			//No longer needed, as this hover effect can be handled with CSS!
			/*
			mapCapital.on("mouseover", function() { 
                    d3.select(this)
                    .classed("hover", true)
                });
                
        	mapCapital.on("mouseout", function() { 
            	d3.select(this)
                .classed("hover", false)
        		});
			*/

		for (var i = 0; i < 5; i++) {
			svg.append("rect")
				.attr("y", 490)
				.attr("x", (i*20)+75)
				.attr("width", 20)
				.attr("height", 20)
				.attr("fill", legendColor[i])
				.attr("class", "rect")
								};

			svg.append("text")
				.attr("x", 70)
				.attr("y", 505)
				.attr("text-anchor", "end")
				.attr("class", "legend")
				.text("7%");

			svg.append("text")
				.attr("x", 210)
				.attr("y", 505)
				.attr("text-anchor", "end")
				.attr("class", "legend")
				.text("16.5%");

			});
	});
	
	</script>

</div>
</body>
</html>

main.css

body {
	background-color: #ededeb;
	font-family: "Lato", sans-serif;
	font-weight: 400;
	font-size: 16px;
}

h1 {
	font-size: 30px;
	font-family: "Lato", sans-serif;
	font-weight: 400;
	text-align: left;
	color: dimgrey;
}


.text {
	padding: 0 1%;
	margin-left: 1%;
	margin-right: 1%;
	margin-bottom: 0px;
	background-color: #ededeb;
	text-align: left;
	text-indent: 30px;
}

.path {
	opacity: 0.75;
	stroke: dimgrey;
}

.path:hover {
	opacity: 1;
	cursor: crosshair;
}

.capital circle {
	stroke: dimgrey;
	stroke-opacity: 0.75;
	fill: lightgrey;
	opacity: 0.75;

}

/* Hover pseudoclass is applied to the GROUP,
   although visual changes occur on the child
   elements WITHIN each group */
.capital:hover circle {
	stroke-width: 1.5px;
	stroke: dimgrey;
	stroke-opacity: 1;
	cursor: crosshair;
	opacity: 1;
}

.capital:hover text {
    fill: red;
	font-weight: 700;
	font-size: 18px;
}

.capital:hover tspan {
	fill: dimgrey;
	font-weight: 300;
	font-size: 16px;
}	

.legend {
	font-size: 12px;
	font-family: "Lato", sans-serif;
	font-weight: 300;
	color: dimgrey;
}

.rect {
	opacity: 0.75;
	stroke: lightgrey;
	stroke-width: 0;

}

#wrapper {
	width: 50%;
	height: 100%;
	margin: 0 auto;
	position: relative;
}

#content {
	padding: 0;
	background-color: #ededeb;
	margin: 0 1%;
	text-align: center;
}

woj_stats.csv

woj,area,population,density,un_rate_woj,capital,un_rate_capital,latitude,longitude
Dolnośląskie,19947,2909997,146,9.4,Wrocław,3.5,51.11,17.022222
Kujawsko-pomorskie,17972,2092564,116,13.8,Bydgoszcz,5.7,53.125,18.011111
Lubelskie,25122,2156150,86,11.5,Lublin,8,51.248056,22.570278
Lubuskie,13988,1021470,73,11.3,Gorzów Wielkopolski,4.8,52.730833,15.238333
Łódzkie,18219,2513093,138,11.2,Łódź,9.9,51.776667,19.454722
Małopolskie,15183,3360581,221,8.8,Kraków,4.6,50.061389,19.938333
Mazowieckie,35558,5316840,150,9,Warszawa,3.7,52.232222,21.008333
Opolskie,9412,1004416,107,10.6,Opole,5.3,50.664722,17.926944
Podkarpackie,17846,2129294,119,13.1,Rzeszów,7.3,50.033611,22.004722
Podlaskie,20187,1194965,59,12.1,Białystok,10.9,53.135278,23.145556
Pomorskie,18310,2295811,125,9.8,Gdańsk,4.5,54.3475,18.645278
Śląskie,12333,4599447,373,8.8,Katowice,3.9,50.264167,19.023611
Świętokrzyskie,11711,1268239,108,13,Kielce,8.4,50.874167,20.633333
Warmińsko-mazurskie,24173,1446915,60,16.5,Olsztyn,5.9,53.773056,20.476111
Wielkopolskie,29826,3467016,116,7,Poznań,2.5,52.408333,16.934167
Zachodniopomorskie,22892,1718861,75,13.7,Szczecin,7.4,53.438056,14.542222