Part of the video course: D3.js in Motion.
This scatter plot shows temperature in degrees celcius in San Francisco for one week. The data was collected from the (now defunct) Data Canvas - Sense Your City API.
forked from curran's block: Scatter Plot with Time Axis
forked from anonymous's block: Scatter Plot with Time Axis
xxxxxxxxxx
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://unpkg.com/d3-tip@0.7.1"></script>
<title>Temperature Visualization</title>
<style>
body {
margin: 0px;
}
.domain {
display: none;
}
.tick line {
stroke: #C0C0BB;
}
.tick text {
fill: #8E8883;
font-size: 20pt;
font-family: sans-serif;
}
.axis-label {
fill: #635F5D;
font-size: 30pt;
font-family: sans-serif;
}
/* Tooltip styles copied from
https://bl.ocks.org/Caged/6476579 */
.d3-tip {
line-height: 1;
padding: 12px;
background: rgba(0, 0, 0, 0.8);
color: #fff;
border-radius: 2px;
}
</style>
</head>
<body>
<svg width="960" height="500"></svg>
<script>
const xValue = d => d.Date;
const xLabel = 'Time';
const yValue = d => d.Rides;
const yLabel = 'Rides';
const margin = { left: 120, right: 30, top: 20, bottom: 120 };
const svg = d3.select('svg');
const width = svg.attr('width');
const height = svg.attr('height');
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const g = svg.append('g')
.attr('transform', `translate(${margin.left},${margin.top})`);
const xAxisG = g.append('g')
.attr('transform', `translate(0, ${innerHeight})`);
const yAxisG = g.append('g');
xAxisG.append('text')
.attr('class', 'axis-label')
.attr('x', innerWidth / 2)
.attr('y', 100)
.text(xLabel);
yAxisG.append('text')
.attr('class', 'axis-label')
.attr('x', -innerHeight / 2)
.attr('y', -80)
.attr('transform', `rotate(-90)`)
.style('text-anchor', 'middle')
.text(yLabel);
const xScale = d3.scaleTime();
const yScale = d3.scaleLinear();
const xAxis = d3.axisBottom()
.scale(xScale)
.ticks(5)
.tickPadding(15)
.tickSize(-innerHeight);
const yAxis = d3.axisLeft()
.scale(yScale)
.ticks(5)
.tickPadding(15)
.tickSize(-innerWidth);
const row = d => {
d.Date = new Date(d.Date);
d.Rides = +d.Rides;
return d;
};
var tip = d3.tip()
.attr('class', 'd3-tip')
.offset([-10, 0])
.html(function(d) {
return "<p>Date: " + d3.timeFormat("%A")(d.Date) + "</p><p>Rides: " + d.Rides + "</p>";
})
svg.call(tip);
d3.csv('metro-bike-share-trips-2017-q3_date_small.csv', row, data => {
xScale
.domain(d3.extent(data, xValue))
.range([0, innerWidth])
.nice();
yScale
.domain(d3.extent(data, yValue))
.range([innerHeight, 0])
.nice();
g.selectAll('circle').data(data)
.enter().append('circle')
.attr('cx', d => xScale(xValue(d)))
.attr('cy', d => yScale(yValue(d)))
.attr('fill-opacity', 0.6)
.attr('r', 8)
.on('mouseover', tip.show)
.on('mouseout', tip.hide);
xAxisG.call(xAxis);
yAxisG.call(yAxis);
});
</script>
</body>
</html>
https://d3js.org/d3.v4.min.js
https://unpkg.com/d3-tip@0.7.1