Public
Edited
Sep 19, 2023
1 fork
4 stars
Insert cell
Insert cell
Insert cell
Insert cell
new_data = {
let new_data = [data[0]];
for (let i = 1; i < data.length; i++) {
let [x1, y1] = new_data.slice(-1)[0];
let [x2, y2] = data[i];
if (y1 * y2 < 0) {
new_data.push([(x2 * y1 - x1 * y2) / (y1 - y2), 0]);
}
new_data.push(data[i]);
}
return new_data;
}
Insert cell
data = {
redo;
let data = Array.from(d3.cumsum({ length: 600 }, d3.randomNormal())).map(
(y, i) => [i, y]
);
return data;
}

// Seems to work with consecutive zeros as well.
// data = d3
// .range(10)
// .map(() => d3.randomUniform()() + 5)
// .concat(d3.range(5).map(() => 0))
// .concat(d3.range(10).map(() => -(d3.randomUniform()() + 5)))
// .map((y, i) => [i, y])
Insert cell
Insert cell
Plot.plot({
width: 1280,
marks: [
Plot.areaY(
new_appl_data.filter((d) => d.value >= 0),
{
x: (d) => d.Date,
y: (d) => d.value,
fill: "green"
}
),
Plot.areaY(
new_appl_data.filter((d) => d.value <= 0),
{
x: (d) => d.Date,
y: (d) => d.value,
fill: "red"
}
),
Plot.line(new_appl_data, { x: (d) => d.Date, y: (d) => d.value })
]
})
Insert cell
new_appl_data = {
let new_data = [shifted_appl_data[0]];
for (let i = 1; i < shifted_appl_data.length; i++) {
let d1 = new_data.slice(-1)[0];
let v1 = d1.value;
let d2 = shifted_appl_data[i];
let v2 = d2.value;
if (v1 * v2 < 0) {
let t1 = d1.Date.getTime();
let t2 = d2.Date.getTime();
let t = new Date((t2 * v1 - t1 * v2) / (v1 - v2));
new_data.push({ Date: t, value: 0 });
}
new_data.push(shifted_appl_data[i]);
}
return new_data;
}
Insert cell
shifted_appl_data = aapl.map((d) => Object.assign(d, { value: d.High - 110 }))
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