<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF8"> <title>A real time data visualization</title> <script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/d3-legend/1.10.0/d3-legend.js"></script> <script src="https://d3js.org/d3-queue.v2.min.js"></script> <script> q=d3_queue.queue(); </script> <style> #g0 { fill: #eafeea; } #g1 { fill: #d5fdd5; } #g2 { fill: #c1fcc1; } #g3 { fill: #acfbac; } #g4 { fill: #88e188; } #g5 { fill: #6aaf6a; } #g6 { fill: #4c7d4c; } #g7 { fill: #2d4b2d; } .g0 { fill: #eafeea; } .g1 { fill: #d5fdd5; } .g2 { fill: #c1fcc1; } .g3 { fill: #acfbac; } .g4 { fill: #88e188; } .g5 { fill: #6aaf6a; } .g6 { fill: #4c7d4c; } .g7 { fill: #2d4b2d; } .zipcode{stroke:black;} </style> </head> <body> <script> (function(){ var rectData=[] var scaleX var data; var dataGeo var dataZipcode={}; var dataCalls={}; var h = 600; var w = 550; var width=400; var svg =d3.select("body").append("svg") .attr("width",w) .attr("height",h) .attr("id","svgone"); var projection= d3.geo.albers() .scale(45000) .rotate([120.5,.25,0]); var path = d3.geo.path() .projection(projection); var quantize; var newData; var check; var newDict={}; var mapDict={}; //ordinal scale var ordinal=d3.scale.ordinal().domain(["#g0","#g1","#g2","#g3","#g4","#g5","#g6","#g7"]) .range(["#eafeea","#d5fdd5","#c1fcc1","#acfbac","#88e188","#6aaf6a","#4c7d4c","#2d4b2d"]) //mouseover mouseout var selecetion; var mouseover= function(d){ var z = this.getAttribute('class') console.log(z) if(z.slice(0,1)=="y"){ var z = this.getAttribute('class'); var y = z.slice(1,6); d3.select("." + this.getAttribute('class')) .style("fill","orange") d3.select('.z'+y) .style("fill","orange") d3.select('#svgone') .append("text") .attr("class","text") .attr({ x:5, y:250, "font-size": "12px", "font-family":"Sans-Serif" }) .text("Name: "+d.properties.PO_NAME) d3.select('#svgone') .append("text") .attr("class","text") .attr({ x:5, y:260, "font-size": "12px", "font-family":"Sans-Serif" }) .text("Zipcode: " +d.properties.ZIP5+ ", Calls: " +newDict[d.properties.ZIP5])} else{ var z = this.getAttribute('class'); var y = z.slice(1,6); d3.select("." + this.getAttribute('class')) .style("fill","orange"); d3.select('.y'+y) .style("fill","orange") d3.select('#svgone') .append("text") .attr("class","text") .attr({ x:5, y:250, "font-size": "12px", "font-family":"Sans-Serif" }) .text("Name: "+mapDict[d.zipcode].name) d3.select('#svgone') .append("text") .attr("class","text") .attr({ x:5, y:260, "font-size": "12px", "font-family":"Sans-Serif" }) .text("Zipcode: " +mapDict[d.zipcode].zipcode+ ", Calls: " +mapDict[d.zipcode].calls)} }; var mouseout= function(d){ var z = this.getAttribute('class') console.log(z.slice(0,1)=="y") if(z.slice(0,1)=="y"){ var z = this.getAttribute('class'); var y = z.slice(1,6); var color=ordinal('#'+quantize(newDict[d.properties.ZIP5])) console.log(color) d3.select("." + this.getAttribute('class')) .style("fill",ordinal('#'+quantize(newDict[d.properties.ZIP5]))) d3.select('.z'+y) .style("fill",ordinal('#'+quantize(newDict[d.properties.ZIP5]))) d3.selectAll(".text").remove() }else{ console.log(d.calls) console.log('#'+quantize(d.calls)) console.log(ordinal(quantize(d.calls))) var z = this.getAttribute('class'); var y = z.slice(1,6); d3.select("." + this.getAttribute('class')) .style("fill",ordinal('#'+quantize(d.calls))); d3.select('.y'+y) .style("fill",ordinal('#'+quantize(d.calls)))} d3.selectAll('.text').remove(); }; //defer double request q.defer(d3.json,"http://saccounty.cloudapi.junar.com/api/v2/datastreams/311-CASES-BY-ZIPCO-SUMMA/data.json/?auth_key=77bf2351cdb42d68f577b6c54041550cf708b773") .defer(d3.json,"saczipgeo.json") .awaitAll(ready) function ready(error,first){ if(error){alert("You had an error retrieving data");} //preparing data and everything for first json file data=first; data=data[0]; data.result.fArray.forEach(function(value,i){ if(i%2==0){ dataZipcode[i]=data.result.fArray[i].fStr } if(i%2!=0){ dataCalls[i]=data.result.fArray[i].fStr } }); data=[]; for ( i=0;i<=108;i=i+2){ if(i==0){ data[i]={"zipcode":dataZipcode[i],"calls":dataCalls[i+1]}; } data[i/2]={"zipcode":dataZipcode[i],"calls":dataCalls[i+1]}; }; //scale for data colors var maxD=d3.max(data.slice(1,data.length-1),function(d){return parseInt(d.calls)}); console.log(maxD); var minD=d3.min(data.slice(1,data.length-1),function(d){return d.calls}); quantize= d3.scale.quantize() .domain([0,maxD]) .range(d3.range(8).map(function(i) { return "g"+i; })); data.forEach(function(d){return newDict[d.zipcode]= +d.calls;}); //preparing for the second json dataGeo=first[1]; dataGeo=dataGeo.features //checking for zipcodes that had zero calls(will be undefined in the dataMap object for(i=0;i<dataGeo.length;i++){ if (newDict[dataGeo[i].properties.ZIP5] === undefined){ newDict[dataGeo[i].properties.ZIP5]=0; }; }; svg.selectAll("zipcode") .data(dataGeo) .enter().append("path") .attr("d", path) .attr("class",function(d){return 'y'+ d.properties.ZIP5}) .attr("id",function(d){return quantize(newDict[d.properties.ZIP5])}) .attr("stroke","black") .on("mouseover",mouseover) .on("mouseout",mouseout) var svg2=d3.select("body") .append("svg") .attr({ width: width, height:h, id:"svgtwo" }); scaleX = d3.scale.linear() .domain([0,maxD]) .range([0,width]); for(i=0;i<dataGeo.length;i++){ rectData[i] = {"zipcode":dataGeo[i].properties.ZIP5,"calls":newDict[dataGeo[i].properties.ZIP5]} }; rectData.sort(function(a, b){ return b.calls-a.calls; }) var barPadding=1; svg2.selectAll("rect") .data(rectData) .enter() .sort(function(a, b) { return d3.ascending(a, b); }) .append("rect") .attr("width",function(d){return scaleX(d.calls)}) .attr("height", function(d,i){return (h/rectData.length)-barPadding;}) .attr("y",function(d,i){return (h/rectData.length)*i;}) .attr("id",function(d){return quantize(d.calls)}) .attr("class",function(d){return 'z'+d.zipcode;}) .on("mouseover",mouseover) .on("mouseout",mouseout); for(i=0;i<dataGeo.length;i++){ mapDict[dataGeo[i].properties.ZIP5]={'name':dataGeo[i].properties.PO_NAME,'zipcode':dataGeo[i].properties.ZIP5,'calls':newDict[dataGeo[i].properties.ZIP5]}; }; d3.select('#svgtwo') .append('line') .attr({ x1:0, y1:0, x2:0, y2:h, "stroke-width":"1px", "stroke":"black", }); //legend svg.append("g") .attr("class", "legendQuant") .attr("transform", "translate(350,450)"); var legend = d3.legend.color() .labelFormat(d3.format(".2f")) .useClass(true) .scale(quantize); svg.select(".legendQuant") .call(legend); };})(); </script> for more info or data vist <a href="http://data.saccounty.net/home">http://data.saccounty.net/home</a> </body> <html>