Built with blockbuilder.org
forked from anonymous's block: fresh block
Built with blockbuilder.org
forked from anonymous's block: fresh block
<html> | |
<div id=his-chart></div> | |
<style> | |
body { | |
font: 10px sans-serif; | |
} | |
.chord { | |
fill-opacity: .67; | |
} | |
</style> | |
<body> | |
<script type="text/javascript" src="http://d3js.org/d3.v2.min.js"></script> | |
<script> | |
var gauge = function(container, configuration) { | |
var that = {}; | |
var config = { | |
size : 200, | |
clipWidth : 200, | |
clipHeight : 110, | |
ringInset : 20, | |
ringWidth : 20, | |
pointerWidth : 10, | |
pointerTailLength : 5, | |
pointerHeadLengthPercent : 0.9, | |
minValue : -100, | |
maxValue : 100, | |
minAngle : -90, | |
maxAngle : 90, | |
transitionMs : 750, | |
majorTicks : 5, | |
labelFormat : d3.format(',g'), | |
labelInset : 10, | |
arcColorFn : d3.interpolateHsl(d3.rgb('red'), d3.rgb('green')) | |
}; | |
var range = undefined; | |
var r = undefined; | |
var pointerHeadLength = undefined; | |
var value = 0; | |
var svg = undefined; | |
var arc = undefined; | |
var scale = undefined; | |
var ticks = undefined; | |
var tickData = undefined; | |
var pointer = undefined; | |
var donut = d3.layout.pie(); | |
function deg2rad(deg) { | |
return deg * Math.PI / 180; | |
} | |
function newAngle(d) { | |
var ratio = scale(d); | |
var newAngle = config.minAngle + (ratio * range); | |
return newAngle; | |
} | |
function configure(configuration) { | |
var prop = undefined; | |
for ( prop in configuration ) { | |
config[prop] = configuration[prop]; | |
} | |
range = config.maxAngle - config.minAngle; | |
r = config.size / 2; | |
pointerHeadLength = Math.round(r * config.pointerHeadLengthPercent); | |
// a linear scale that maps domain values to a percent from 0..1 | |
scale = d3.scale.linear() | |
.range([0,1]) | |
.domain([config.minValue, config.maxValue]); | |
ticks = scale.ticks(config.majorTicks); | |
tickData = d3.range(config.majorTicks).map(function() {return 1/config.majorTicks;}); | |
arc = d3.svg.arc() | |
.innerRadius(r - config.ringWidth - config.ringInset) | |
.outerRadius(r - config.ringInset) | |
.startAngle(function(d, i) { | |
var ratio = d * i; | |
return deg2rad(config.minAngle + (ratio * range)); | |
}) | |
.endAngle(function(d, i) { | |
var ratio = d * (i+1); | |
return deg2rad(config.minAngle + (ratio * range)); | |
}); | |
} | |
that.configure = configure; | |
function centerTranslation() { | |
return 'translate('+r +','+ r +')'; | |
} | |
function isRendered() { | |
return (svg !== undefined); | |
} | |
that.isRendered = isRendered; | |
function render(newValue) { | |
svg = d3.select(container) | |
.append('svg:svg') | |
.attr('class', 'gauge') | |
.attr('width', config.clipWidth) | |
.attr('height', config.clipHeight); | |
var centerTx = centerTranslation(); | |
var arcs = svg.append('g') | |
.attr('class', 'arc') | |
.attr('transform', centerTx); | |
arcs.selectAll('path') | |
.data(tickData) | |
.enter().append('path') | |
.attr('fill', function(d, i) { | |
return config.arcColorFn(d * i); | |
}) | |
.attr('d', arc); | |
var lg = svg.append('g') | |
.attr('class', 'label') | |
.attr('transform', centerTx); | |
lg.selectAll('text') | |
.data(ticks) | |
.enter().append('text') | |
.attr('transform', function(d) { | |
var ratio = scale(d); | |
var newAngle = config.minAngle + (ratio * range); | |
return 'rotate(' +newAngle +') translate(0,' +(config.labelInset - r) +')'; | |
}) | |
.text(config.labelFormat); | |
var lineData = [ [config.pointerWidth / 2, 0], | |
[0, -pointerHeadLength], | |
[-(config.pointerWidth / 2), 0], | |
[0, config.pointerTailLength], | |
[config.pointerWidth / 2, 0] ]; | |
var pointerLine = d3.svg.line().interpolate('monotone'); | |
var pg = svg.append('g').data([lineData]) | |
.attr('class', 'pointer') | |
.attr('transform', centerTx); | |
pointer = pg.append('path') | |
.attr('d', pointerLine/*function(d) { return pointerLine(d) +'Z';}*/ ) | |
.attr('transform', 'rotate(' +config.minAngle +')'); | |
update(newValue === undefined ? 0 : newValue); | |
} | |
that.render = render; | |
function update(newValue, newConfiguration) { | |
if ( newConfiguration !== undefined) { | |
configure(newConfiguration); | |
} | |
var ratio = scale(newValue); | |
var newAngle = config.minAngle + (ratio * range); | |
pointer.transition() | |
.duration(config.transitionMs) | |
.ease('elastic') | |
.attr('transform', 'rotate(' +newAngle +')'); | |
} | |
that.update = update; | |
configure(configuration); | |
return that; | |
}; | |
function onDocumentReady() { | |
var powerGauge = gauge('#his-chart', { | |
size: 300, | |
clipWidth: 300, | |
clipHeight: 300, | |
ringWidth: 60, | |
maxValue: 100, | |
transitionMs: 4000, | |
}); | |
powerGauge.render(); | |
function updateReadings() { | |
// just pump in random data here... | |
powerGauge.update(-30); | |
} | |
// every few seconds update reading values | |
updateReadings(); | |
setInterval(function() { | |
updateReadings(); | |
}, 5 * 1000); | |
} | |
if ( !window.isLoaded ) { | |
window.addEventListener("load", function() { | |
onDocumentReady(); | |
}, false); | |
} else { | |
onDocumentReady(); | |
} | |
</script> | |
</html> |