viewof graph5 = {
const WIDTH = width
const HEIGHT = WIDTH / 4
const MARGIN = WIDTH / 200
const container = DOM.svg(WIDTH, HEIGHT)
const svg = d3.select(container)
let DATA = Array.from(Array(10)).map(Math.random)
.map((d, i) => ({ id: i, value: d }))
const heightScale = d3.scaleLinear()
.domain([0, d3.max(DATA, d => d.value)])
.range([0, HEIGHT])
let BAR_WIDTH = WIDTH / DATA.length
const bars = svg.selectAll('rect')
.data(DATA, d => d.id)
.enter()
.append('rect')
.attr('x', (d, i) => i * BAR_WIDTH)
.attr('width', BAR_WIDTH - MARGIN)
.attr('y', d => HEIGHT - heightScale(d.value))
.attr('height', d => heightScale(d.value))
const btn = d3.select(button)
btn.on('click', () => {
const nextId = d3.max(DATA, d => d.id) + 1
DATA = [...DATA.splice(1), { id: nextId, value: Math.random() }]
BAR_WIDTH = WIDTH / DATA.length
const newBars = svg.selectAll('rect').data(DATA, d => d.id)
const entering = newBars.enter()
.append('rect')
.attr('x', WIDTH)
.attr('width', BAR_WIDTH - MARGIN)
.attr('y', d => HEIGHT - heightScale(d.value))
.attr('height', d => heightScale(d.value))
newBars.exit()
.transition()
.attr('x', -BAR_WIDTH)
.remove()
newBars.merge(entering)
.transition()
.duration(1000)
.attr('x', (d, i) => i * BAR_WIDTH)
.attr('width', BAR_WIDTH - MARGIN)
.attr('y', d => HEIGHT - heightScale(d.value))
.attr('height', d => heightScale(d.value))
})
return container
}