Skip to content

Instantly share code, notes, and snippets.

@tgotwig
Last active December 5, 2017 22:11
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 tgotwig/b8c4191a3bf97da661ab9889f8b7cd2c to your computer and use it in GitHub Desktop.
Save tgotwig/b8c4191a3bf97da661ab9889f8b7cd2c to your computer and use it in GitHub Desktop.
Scatterplot (+linear regression, random)
<!DOCTYPE html>
<meta charset="utf-8">
<svg width="960" height="500"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script>
;(function (d3, $) {
window.drawScatterPlot = function () {
var margin = {top: 20, right: 20, bottom: 30, left: 40}
var width = 960 - margin.left - margin.right
var height = 500 - margin.top - margin.bottom
var xScale = d3.scaleLinear().range([0, width])
var yScale = d3.scaleLinear().range([height, 0])
var xAxis = d3.axisBottom().scale(xScale)
var yAxis = d3.axisLeft().scale(yScale)
var svg = d3.select('svg')
.append('g')
.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
xScale.domain(d3.extent(data, function (d) { return d.y })).nice()
yScale.domain(d3.extent(data, function (d) { return d.x })).nice()
svg.append('g')
.attr('class', 'x axis')
.attr('transform', 'translate(0,' + height + ')')
.call(xAxis)
svg.append('g')
.attr('class', 'y axis')
.call(yAxis)
// regression
let meanX = []
let meanY = []
Array.from(data).forEach(e => meanX.push(e.x))
Array.from(data).forEach(e => meanY.push(e.y))
meanX = _.mean(meanX)
meanY = _.mean(meanY)
let bTop = 0
let bBottom = 0
Array.from(data).forEach(e => { bTop += (e.x - meanX) * (e.y - meanY) })
Array.from(data).forEach(e => { bBottom += (Math.pow(e.x - meanX, 2)) })
const b = bTop / bBottom
const a = meanY - b * meanX
svg.append('line')
.style('stroke', 'purple')
.attr('x1', xScale(0))
.attr('y1', yScale(a + b * 0))
.attr('x2', xScale(9))
.attr('y2', yScale(a + b * 9))
// regression end
svg.selectAll('.dot')
.data(data)
.enter()
.append('circle')
.attr('class', 'dot')
.attr('r', 3.5)
.attr('cx', function (d) { return xScale(d.y) })
.attr('cy', function (d) { return yScale(d.x) })
.attr('fill-opacity', '0')
.attr('stroke-width', 1)
.attr('stroke', function (d) { return (d.x > a + b * d.y) ? 'yellowgreen' : 'steelblue' })
}
const data = []
for (let i = 0; i < 99; i++) {
data.push({
'x': d3.randomUniform(0, 9)(),
'y': d3.randomUniform(0, 9)(),
})
}
}(window.d3, window.$))
</script>
<script>drawScatterPlot()</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment