Skip to content

Instantly share code, notes, and snippets.

@soooh
Last active March 25, 2023 12:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save soooh/15db2fd23c93acec8b7dd55fb826bded to your computer and use it in GitHub Desktop.
Save soooh/15db2fd23c93acec8b7dd55fb826bded to your computer and use it in GitHub Desktop.
basic error bars
<!DOCTYPE html>
<meta charset="utf-8">
<svg></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
//
// `data` is a randomly generated data set.
// my assumption is that you will structure your data with
// some kind of confidence, error, standard deviation, or
// whatever to display whatever uncertainty you'd like to show.
//
// generate random data with d3 range and map
var data = d3.range(40).map(function(i) {
return {
x: i + 1,
// generate a random value between 40 and 60
y: d3.randomUniform(40, 60)(),
// generate a random interval between 1 and 5
e: d3.randomUniform(1, 5)()
};
});
var width = document.documentElement.clientWidth,
height = document.documentElement.clientHeight;
var svg = d3.select('svg').attr('width', width).attr('height', height);
var margin = {top: 20, right: 20, bottom: 30, left: 50},
chartWidth = width - margin.left - margin.right,
chartHeight = height - margin.top - margin.bottom,
g = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
var x = d3.scaleLinear()
.range([0, chartWidth])
.domain([0, 40]);
var y = d3.scaleLinear()
.range([chartHeight, 0])
.domain([0, 100]);
var addData = function() {
var points = g.selectAll('circle.point')
.data(data);
points.enter()
.append('circle')
.attr('class', 'point')
.attr('r', 2)
.merge( points )
.attr('cx', function(d) { return x(d.x); })
.attr('cy', function(d) { return y(d.y); })
var lines = g.selectAll('line.error')
.data(data);
lines.enter()
.append('line')
.attr('class', 'error')
.merge(lines)
.attr('x1', function(d) { return x(d.x); })
.attr('x2', function(d) { return x(d.x); })
.attr('y1', function(d) { return y(d.y + d.e); })
.attr('y2', function(d) { return y(d.y - d.e); });
};
// axes
var xAxis = g.append('g')
.attr('transform', 'translate(0,' + chartHeight + ')')
.call( d3.axisBottom(x) );
var yAxis = g.append('g')
.call( d3.axisLeft(y) );
addData();
// resize
window.onresize = function() {
width = document.documentElement.clientWidth;
height = document.documentElement.clientHeight;
svg.attr('width', width).attr('height', height)
chartWidth = width - margin.left - margin.right;
chartHeight = height - margin.top - margin.bottom;
x.range([0, chartWidth]);
y.range([chartHeight, 0]);
xAxis
.attr('transform', 'translate(0,' + chartHeight + ')')
.call( d3.axisBottom(x) );
yAxis.call( d3.axisLeft(y) );
addData();
};
</script>
<style>
g.datapoint {
opacity: 0.5;
circle {
fill: red;
}
}
line {
stroke: black;
stroke-width: 1px;
fill: none;
}
</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment