Published
Edited
Oct 21, 2021
2 stars
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
candlestick(data)
Insert cell
data = await getQuoteHistory(ticker, range)
Insert cell
lineChart = data => {
const hover = vl
.selectSingle()
.encodings('x')
.on('mouseover')
.nearest(true)
.empty('none');
const line = vl.markLine().encode(
vl.x().fieldT('date'),
vl
.y()
.fieldQ('close')
.scale({ type: 'log', base: 10 }),
vl
.color()
.fieldN('symbol')
.legend(null)
);
const base = line.transform(vl.filter(hover));
const label = { align: 'left', dx: 5, dy: -5 };
const white = { stroke: 'white', strokeWidth: 2 };

return vl
.data(data)
.layer(
line.select(
vl
.selectInterval()
.bind('scales')
.encodings('x')
),
vl
.markRule({ color: '#aaa' })
.transform(vl.filter(hover))
.encode(vl.x().fieldT('date')),
line
.markCircle()
.select(hover)
.encode(
vl
.opacity()
.if(hover, vl.value(1))
.value(0)
),
base.markText(label, white).encode(vl.text().fieldQ('close')),
base.markText(label).encode(vl.text().fieldQ('close'))
)
.width(width - 50)
.height(400)
.render();
}
Insert cell
candlestick = data => {
return vl
.data(data)
.encode(
vl.x().fieldT('date'),
vl
.color({ value: '#ae1325' })
.condition({
test: 'datum.open < datum.close',
value: '#06982d'
})
.legend(null)
)
.layer(
vl.markRule().encode(
vl
.y()
.fieldQ('low')
.scale({ zero: false }),
vl.y2().fieldQ('high')
),
vl.markBar().encode(vl.y().fieldQ('open'), vl.y2().fieldQ('close'))
)
.width(width - 50)
.height(400)
.render();
}
Insert cell
import { getQuote, getQuoteHistory, symbols } from "@gnestor/yahoo-finance"
Insert cell
import { autoSelect, select } from '@observablehq/legacy-inputs'
Insert cell
import { vl } from '@vega/vega-lite-api'
Insert cell
d3 = require('d3')
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more