Forked from tjdecke/README.md
Data shows answers to a question in the Asia Foundation's 2012 Survey of the Afghan People broken down by gender, age, location, ethnicity, income, education and region.
Forked from tjdecke/README.md
Data shows answers to a question in the Asia Foundation's 2012 Survey of the Afghan People broken down by gender, age, location, ethnicity, income, education and region.
| Absolutes | Total: | Male | Female | 18-24 y.o. | 25-34 y.o. | 35-44 y.o. | 45-54 y.o. | over 55 y.o. | Villages | Urban | Pashtun | Tajik | Uzbek | Hazara | Other | Less than 2,000 Afs | 2,001 - 3,000 Afs | 3,001 - 5,000 Afs (incl. refused and DK) | 5,001 - 10,000 Afs | 10,001+ Afs | Never went to school (incl. refused and DK) | 1-6 grade | 7-9 grade | 10+ grade | Central/Kabul | Eastern | South East | South Western | Western | North East | Central/Hazarjat | North West | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Base: All Respondents | 6348 | 3638 | 2710 | 1572 | 1724 | 1512 | 945 | 594 | 4983 | 1365 | 2620 | 2009 | 553 | 695 | 471 | 551 | 1066 | 1240 | 1991 | 1500 | 3675 | 970 | 581 | 1122 | 1428 | 617 | 680 | 708 | 856 | 927 | 222 | 910 | |
| Right direction | 2933 | 1698 | 1235 | 723 | 775 | 715 | 429 | 291 | 2392 | 541 | 1170 | 935 | 253 | 349 | 226 | 281 | 540 | 536 | 888 | 688 | 1721 | 444 | 266 | 502 | 511 | 283 | 266 | 362 | 400 | 508 | 131 | 472 | |
| Wrong direction | 2200 | 1340 | 859 | 549 | 607 | 521 | 325 | 197 | 1623 | 576 | 976 | 683 | 183 | 190 | 167 | 174 | 348 | 419 | 710 | 548 | 1202 | 350 | 213 | 434 | 666 | 264 | 226 | 234 | 252 | 251 | 46 | 262 | |
| Some in right, some in wrong direction (vol.) | 1084 | 531 | 554 | 267 | 307 | 242 | 175 | 93 | 857 | 228 | 425 | 345 | 100 | 143 | 71 | 76 | 156 | 250 | 363 | 240 | 658 | 165 | 90 | 171 | 228 | 65 | 170 | 109 | 170 | 151 | 32 | 160 | |
| Refused (vol.) | 6 | 3 | 3 | 0 | 3 | 3 | 0 | 0 | 5 | 1 | 2 | 3 | 0 | 1 | 0 | 0 | 2 | 2 | 0 | 2 | 5 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 2 | 2 | 0 | 0 | |
| Don't know (vol.) | 125 | 65 | 59 | 33 | 32 | 31 | 16 | 13 | 106 | 19 | 47 | 44 | 15 | 11 | 8 | 19 | 20 | 33 | 31 | 22 | 88 | 11 | 12 | 13 | 20 | 6 | 19 | 4 | 33 | 15 | 13 | 16 |
| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> | |
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <style type="text/css"> | |
| rect.bordered { | |
| stroke: #E6E6E6; | |
| stroke-width: 2px; | |
| } | |
| text.mono { | |
| font-size: 9pt; | |
| font-family: Consolas, courier; | |
| fill: #aaa; | |
| } | |
| text.axis { | |
| fill: #000; | |
| } | |
| </style> | |
| <script src="http://d3js.org/d3.v3.js" type="text/javascript"></script> | |
| <title></title> | |
| </head> | |
| <body> | |
| <div id="chart"></div> | |
| <script type="text/javascript"> | |
| var parsedata = [], | |
| margin = { | |
| top: 175, | |
| right: 0, | |
| bottom: 100, | |
| left: 165 | |
| }, | |
| width = 990 - margin.left - margin.right, | |
| height = 430 - margin.top - margin.bottom, | |
| gridSize = Math.floor(width / 36), | |
| legendElementWidth = gridSize * 2, | |
| buckets = 9, | |
| colors = ["#fff7ec", "#fee8c8", "#fdd49e", "#fdbb84", "#fc8d59", "#ef6548", "#d7301f", "#b30000", "#7f0000"], | |
| // alternatively colorbrewer.YlGnBu[9] | |
| fullanswers = ["Right direction", "Wrong direction", "Some in right, some in wrong direction (vol.)", "Refused (vol.)", "Don't know (vol.)"], | |
| answers = ["Right", "Wrong", "Some Right, Some Wrong", "Refused to Answer", "Don't Know"], | |
| categories = ["total", "gendermale", "genderfemale", "age18to24", "age25to34", "age35to44", "age45to54", "age55plus", "settlementvillages", "settlementurban", "ethnicitypashtun", "ethnicitytajik", "ethnicityuzbek", "ethnicityhazara", "ethnicityother", "incomeunder2k", "income2kto3k", "income3kto5k", "income5kto10k", "income10kplus", "edunone", "edu1to6", "edu7to9", "edu10plus", "regionkabul", "regione", "regionse", "regionsw", "regionw", "regionne", "regionhazarjat", "regionnw"], | |
| categorylabels = ["Everybody", "Male", "Female", "Age 18-24", "Age 25-34", "Age 35-44", "Age 45-54", "Age 55+", "Villages", "Urban", "Pashtun", "Tajik", "Uzbek", "Hazara", "Other Ethnicity", "Income <2K", "Income 2K-3K", "Income 3K-5K", "Income 5K-10K", "Income 10K+", "No Education", "Grades 1-6", "Grades 7-9", "Grades 10+", "Kabul", "East", "South East", "South West", "West", "North East", "Hazarjat", "North West"]; | |
| d3.tsv("data.tsv", function(d) { | |
| return { | |
| answer: d["Absolutes"], | |
| total: +d["Total:"], | |
| gendermale: +d["Male"], | |
| genderfemale: +d["Female"], | |
| age18to24: +d["18-24 y.o."], | |
| age25to34: +d["25-34 y.o."], | |
| age35to44: +d["35-44 y.o."], | |
| age45to54: +d["45-54 y.o."], | |
| age55plus: +d["over 55 y.o."], | |
| settlementvillages: +d["Villages"], | |
| settlementurban: +d["Urban"], | |
| ethnicitypashtun: +d["Pashtun"], | |
| ethnicitytajik: +d["Tajik"], | |
| ethnicityuzbek: +d["Uzbek"], | |
| ethnicityhazara: +d["Hazara"], | |
| ethnicityother: +d["Other"], | |
| incomeunder2k: +d["Less than 2,000 Afs"], | |
| income2kto3k: +d["2,001 - 3,000 Afs"], | |
| income3kto5k: +d["3,001 - 5,000 Afs (incl. refused and DK)"], | |
| income5kto10k: +d["5,001 - 10,000 Afs"], | |
| income10kplus: +d["10,001+ Afs"], | |
| edunone: +d["Never went to school (incl. refused and DK)"], | |
| edu1to6: +d["1-6 grade"], | |
| edu7to9: +d["7-9 grade"], | |
| edu10plus: +d["10+ grade"], | |
| regionkabul: +d["Central/Kabul"], | |
| regione: +d["Eastern"], | |
| regionse: +d["South East"], | |
| regionsw: +d["South Western"], | |
| regionw: +d["Western"], | |
| regionne: +d["North East"], | |
| regionhazarjat: +d["Central/Hazarjat"], | |
| regionnw: +d["North West"] | |
| } | |
| }, function(error, data) { | |
| // reference to the first row of data, with the totals | |
| var totalsobj = data[0]; | |
| // step through the remaining rows | |
| for (row = 1; row < data.length; row++) { | |
| var rowobj = data[row]; | |
| for (var key in rowobj) { | |
| // verify that this is the object's own property | |
| if (rowobj.hasOwnProperty(key) && key != "answer") { | |
| // get percentages by dividing the value by the total respondants | |
| var roundedpercent = Math.round((rowobj[key] / totalsobj[key]) * 10000) / 100; | |
| var gridobj = {answer: rowobj['answer'], category: key, percent: roundedpercent, people: rowobj[key] }; | |
| parsedata.push(gridobj); | |
| } | |
| } | |
| } | |
| var colorScale = d3.scale.quantile() | |
| .domain([0, buckets - 1, d3.max(parsedata, function (d) { return d.percent; })]) | |
| .range(colors); | |
| var svg = d3.select("#chart").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 + ")"); | |
| svg.append("text") | |
| .text("Generally speaking, do you think things in Afghanistan today are going in the right direction,") | |
| .attr("x", 0).attr("y", -margin.top + 25); | |
| svg.append("text") | |
| .text("or do you think they are going in the wrong direction?") | |
| .attr("x", 0).attr("y", -margin.top + 45); | |
| var answerLabels = svg.selectAll(".ansLabel") | |
| .data(answers) | |
| .enter().append("text") | |
| .text(function(d) { return d; }) | |
| .attr("x", 0).attr("y", function(d, i) { return i * gridSize; }) | |
| .style("text-anchor", "end") | |
| .attr("transform", "translate(-6," + gridSize / 1.5 + ")") | |
| .attr("class", "mono axis"); | |
| var categoryLabels = svg.selectAll(".catLabel") | |
| .data(categorylabels) | |
| .enter().append("text") | |
| .text(function(d) { return d; }) | |
| .style("text-anchor", "beginning") | |
| .attr("transform", function(d, i) { return "translate(" + ((i * gridSize) + (gridSize / 2)) + ", -6) rotate(-65)" }) | |
| .attr("class", "mono axis"); | |
| var heatMap = svg.selectAll(".gridsquare") | |
| .data(parsedata) | |
| .enter() | |
| .append("rect") | |
| .attr("x", function(d) { return (categories.indexOf(d.category)) * gridSize; }) | |
| .attr("y", function(d) { return (fullanswers.indexOf(d.answer)) * gridSize; }) | |
| .attr("rx", 4) | |
| .attr("ry", 4) | |
| .attr("class", "bordered") | |
| .attr("width", gridSize) | |
| .attr("height", gridSize) | |
| .style("fill", colors[0]); | |
| heatMap.transition().duration(1000) | |
| .style("fill", function(d) { return colorScale(d.percent); }); | |
| heatMap.append("title").text(function(d) { return d.percent + "% (" + d.people + " people)"; }); | |
| var legend = svg.selectAll(".legend") | |
| .data([0].concat(colorScale.quantiles()), function(d) { return d; }) | |
| .enter().append("g"); | |
| legend.append("rect") | |
| .attr("x", function(d, i) { return legendElementWidth * i; }) | |
| .attr("y", height) | |
| .attr("width", legendElementWidth) | |
| .attr("height", gridSize / 2) | |
| .style("fill", function(d, i) { return colors[i]; }); | |
| legend.append("text") | |
| .attr("class", "mono") | |
| .text(function(d) { return "≥ " + Math.round(d); }) | |
| .attr("x", function(d, i) { return legendElementWidth * i; }) | |
| .attr("y", height + gridSize); | |
| }); | |
| </script> | |
| </body> | |
| </html> |