A bar chart of temperatures across Bangalore. Data from Yuktix Open Weather Project, endpoint get-module-snapshot.php
, snapshot from May 17, 9:00PM.
forked from curran's block: Observer Pattern Benchmarks
A bar chart of temperatures across Bangalore. Data from Yuktix Open Weather Project, endpoint get-module-snapshot.php
, snapshot from May 17, 9:00PM.
forked from curran's block: Observer Pattern Benchmarks
{"code":200,"result":[{"id":"1","__rssi":"25","t":"31.0","__net":"smshub","address":"Girinigar","tsUnix":"1463326401143","p":"91643.0","serialNumber":"ainvvy0","rh":"45.0","longitude":"77.54362","latitude":"12.939099","rain":"69","__rtc":"150516,205939"},{"RH":"62.0","WS":"3.1","tsUnix":"1463497347587","LWS":"43","serialNumber":"gkvk001","SDP":"5.0","__rssi":"30","id":"2","T":"26.8","ST":"32.0","address":"GKVK Campus","P":"90389.0","longitude":"77.579504","latitude":"13.086479","Rain":"0"},{"id":"3","__rssi":"31","T":"27.7","RH":"61.0","address":"IISC - Campus","tsUnix":"1463497471842","P":"90322.0","serialNumber":"iisc001","longitude":"77.570733","latitude":"13.017016","Rain":"0","__rtc":"230100,004748"},{"id":"4","__rssi":"31","T":"27.0","RH":"66.0","address":"Public Affairs Center, Jigani - Bommasandra Link Road,","tsUnix":"1463492566279","P":"90538.0","serialNumber":"pacaws1","longitude":"77.661561","latitude":"12.799788","Rain":"0"},{"id":"5","__rssi":"31","T":"26.71","RH":"59.96","address":"Hebbal (Godrej woodsman)","tsUnix":"1463497349648","P":"89857.33","serialNumber":"paws001","longitude":"77.597181","latitude":"13.055438","Rain":"0"},{"id":"6","__rssi":"31","T":"27.57","RH":"60.28","address":"4B Block, Jayanagar","tsUnix":"1463497451988","P":"90243.66","serialNumber":"paws002","longitude":"77.580222","latitude":"12.929648","Rain":"0"},{"id":"7","__rssi":"31","T":"27.2","RH":"62.0","address":"Sarjapura (Rainbow Drive)","tsUnix":"1463493913980","P":"0.0","serialNumber":"rainbow","longitude":"77.687196","latitude":"12.907983","Rain":"0","__rtc":"170516,193416"},{"id":"8","__rssi":"31","T":"27.6","RH":"60.0","address":"Indira Nagar (HAL-II)","tsUnix":"1463497500455","P":"90880.0","serialNumber":"ramkris","longitude":"77.646694","latitude":"12.968259","Rain":"0","__rtc":"170516,202955"},{"id":"9","__rssi":"28","T":"0.0","RH":"0.0","address":"spoorthi Nagar (Uttarahalli)","tsUnix":"1463497297540","P":"0.0","serialNumber":"sandesh","longitude":"77.540946","latitude":"12.911357","Rain":"0"},{"id":"10","__rssi":"31","T":"27.2","RH":"61.0","address":"Electronics City (Huskur Road)","tsUnix":"1463497395746","P":"0.0","serialNumber":"thejesh","longitude":"77.684429","latitude":"12.835487","Rain":"0"},{"id":"11","__rssi":"31","T":"28.2","RH":"57.0","WS":"0.4","address":"HSR Layout (sector-4)","tsUnix":"1463497302905","P":"0.0","serialNumber":"yuktix1","longitude":"77.638493","latitude":"12.914647","Rain":"0","wdc":"NN"},{"id":"12","__rssi":"31","T":"27.1","RH":"61.0","address":"Vidyaranyapura","tsUnix":"1463497447046","P":"0.0","serialNumber":"zenrain","longitude":"77.561276","latitude":"13.084885","Rain":"0","__rtc":"170516,201835"},{"id":"7719","__rssi":"28","T":"27.1","RH":"62.0","address":"IIHS (Sadashiv Nagar)","tsUnix":"1463497439321","P":"0.0","serialNumber":"iihs001","longitude":"77.580927","latitude":"13.005875","Rain":"0","__rtc":"170516,203236"},{"id":"12856","__rssi":"20","T":"25.3","RH":"70.0","address":"Hunsur - Mysore","tsUnix":"1463497410892","P":"91030.0","Lux":"0.98","serialNumber":"itc0001","longitude":"76.304687","latitude":"12.307031","Rain":"0"},{"id":"13375","__rssi":"10","T":"26.0","RH":"85.0","address":"Kothegala,Mysore","tsUnix":"1463497331961","P":"91706.0","Lux":"0.98","serialNumber":"itc0002","longitude":"76.233867","latitude":"12.336308","Rain":"0"},{"RH":"40.0","WS":"2.3","tsUnix":"1462282883939","pyra":"257","serialNumber":"iihs002","LWS":"69","SDP":"4.0","wdc":"SS","__rssi":"31","id":"13409","T":"32.4","ST":"38.0","address":"IIHS (Kengeri campus)","P":"91922.0","longitude":"77.43869","latitude":"12.917989","Rain":"0"},{"id":"20313","__rssi":"18","pmx":"4.9","address":"Public Affairs Centre (Air Quality)","tsUnix":"1463053178536","serialNumber":"pacaq02","CO2":"192","longitude":null,"CO":"156","latitude":null},{"id":"20314","__rssi":"19","pmx":"7.9","address":"Wipro EC (Air Quality)","tsUnix":"1462141387941","serialNumber":"pacaq03","CO2":"158","longitude":"77.6572082","CO":"174","latitude":"12.839581"},{"id":"20322","__rssi":"27","T":"27.3","RH":"60.0","address":"Wipro EC (Weather)","tsUnix":"1463497141637","P":"90300.0","pyra":"0","serialNumber":"wipro01","longitude":"77.6572082","latitude":"12.839581","Rain":"0"},{"RH":"64.0","WS":"0.4","tsUnix":"1463497490759","pyra":"0","serialNumber":"iihr001","LWS":"73","SDP":"6.0","wdc":"NN","__rssi":"27","id":"50005","T":"26.4","ST":"32.3","address":"ICAR - IIHR Bengaluru","P":"91138.0","longitude":"77.4897909","latitude":"13.1337731","Rain":"0"},{"pmy":"0.2","pmx":"0.8","tsUnix":"1463497370974","CO2":"179","serialNumber":"iihraq1","NH3":"16","__rssi":"26","id":"50026","address":"IIHR Observatory (AQ)","longitude":"77.4897909","CO":"166","latitude":"13.1337731","AN":"0"}]} |
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<title>D3 Example</title> | |
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0-beta1/jquery.min.js"></script> | |
<link href='http://fonts.googleapis.com/css?family=Playfair+Display' rel='stylesheet' type='text/css'> | |
<script src="//cdnjs.cloudflare.com/ajax/libs/d3-tip/0.6.3/d3-tip.min.js"></script> | |
<style> | |
.axis text { | |
font-family: 'Playfair Display', serif; | |
font-size: 13pt; | |
} | |
.axis .label { | |
font-size: 28pt; | |
} | |
.axis path, .axis line { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.y.axis path, .y.axis line { | |
stroke: none; | |
} | |
.tooltip { | |
font-family: 'Playfair Display', serif; | |
font-size: 24pt; | |
/* This trick adds a heavy white shadow around the text. */ | |
text-shadow: | |
0px 0px 6px white, | |
0px 0px 6px white, | |
0px 0px 6px white, | |
0px 0px 6px white, | |
0px 0px 6px white, | |
0px 0px 6px white, | |
0px 0px 6px white, | |
0px 0px 6px white, | |
0px 0px 6px white; | |
/* This eliminates the possibility of flickering tooltips. */ | |
pointer-events: none; | |
} | |
</style> | |
</head> | |
<body> | |
<script> | |
var outerWidth = 960; | |
var outerHeight = 500; | |
var margin = { left: 393, top: 0, right: 15, bottom: 108 }; | |
var barPadding = 0.2; | |
var barPaddingOuter = 0.1; | |
var xColumn = "T"; | |
var yColumn = "address"; | |
var xAxisLabelText = "Temperature (°C)"; | |
var xAxisLabelOffset = 80; | |
var innerWidth = outerWidth - margin.left - margin.right; | |
var innerHeight = outerHeight - margin.top - margin.bottom; | |
var svg = d3.select("body").append("svg") | |
.attr("width", outerWidth) | |
.attr("height", outerHeight); | |
var g = svg.append("g") | |
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
var xAxisG = g.append("g") | |
.attr("class", "x axis") | |
.attr("transform", "translate(0," + innerHeight + ")") | |
var xAxisLabel = xAxisG.append("text") | |
.style("text-anchor", "middle") | |
.attr("x", innerWidth / 2) | |
.attr("y", xAxisLabelOffset) | |
.attr("class", "label") | |
.text(xAxisLabelText); | |
var yAxisG = g.append("g") | |
.attr("class", "y axis"); | |
var tooltip = svg.append("text").attr("class", "tooltip"); | |
var xScale = d3.scale.linear().range([0, innerWidth]); | |
var yScale = d3.scale.ordinal().rangeRoundBands([0, innerHeight], barPadding, barPaddingOuter); | |
// Use D3's number format that generates SI prefixes for the X axis. | |
// See also http://en.wikipedia.org/wiki/Metric_prefix#List_of_SI_prefixes | |
var siFormat = d3.format("s"); | |
var xAxis = d3.svg.axis().scale(xScale).orient("bottom") | |
.ticks(5) | |
.outerTickSize(0); | |
var yAxis = d3.svg.axis().scale(yScale).orient("left") | |
.outerTickSize(0); | |
var tooltipFormat = d3.format(","); | |
function showTooltip(d){ | |
tooltip.text(tooltipFormat(d[xColumn]) + " °C") | |
.attr("x", d3.event.pageX + 20) | |
.attr("y", d3.event.pageY); | |
} | |
function hideTooltip(){ | |
tooltip.text(""); | |
} | |
function render(data){ | |
data.sort(function (a, b){ | |
return b[xColumn] - a[xColumn]; | |
}); | |
xScale.domain([0, d3.max(data, function (d){ return d[xColumn]; })]); | |
yScale.domain( data.map( function (d){ return d[yColumn]; })); | |
xAxisG.call(xAxis); | |
yAxisG.call(yAxis); | |
var bars = g.selectAll("rect").data(data); | |
bars.enter().append("rect") | |
.attr("height", yScale.rangeBand()) | |
.on("mouseover", showTooltip) | |
.on("mousemove", showTooltip) | |
.on("mouseout", hideTooltip); | |
bars | |
.attr("x", 0) | |
.attr("y", function (d){ return yScale(d[yColumn]); }) | |
.attr("width", function (d){ return xScale(d[xColumn]); }); | |
bars.exit().remove(); | |
} | |
d3.json("data.json", function (data){ | |
// Unpack the response. | |
data = data.result; | |
// Only include entries with temperature. | |
data = data.filter(function (d){ | |
return d.T; | |
}) | |
// Parse temperature to a number. | |
data.forEach(function (d){ | |
d.T = +d.T; | |
}); | |
render(data); | |
//console.log(JSON.stringify(data, null, 2)); | |
}); | |
</script> | |
</body> | |
</html> |