Public
Edited
Sep 22, 2023
5 stars
Insert cell
Insert cell
Insert cell
viewof pointerX = Inputs.text({label: "pointer offsetX"})
Insert cell
viewof viz = detectFrozen(Plot.plot({
height: 160,
y: {axis: "right", grid: true, nice: true},
marks: [
Plot.lineY(aapl, {x: "Date", y: "Close"}),
Plot.ruleX(aapl, Plot.pointerX({x: "Date", py: "Close", stroke: "red"})),
Plot.dot(aapl, Plot.pointerX({x: "Date", y: "Close", stroke: "red"})),
Plot.text(aapl, Plot.pointerX({px: "Date", py: "Close", dy: -17, frameAnchor: "top-left", fontVariant: "tabular-nums", text: (d) => [`Date ${Plot.formatIsoDate(d.Date)}`, `Close ${d.Close.toFixed(2)}`].join(" ")}))
]
}),
viewof frozen,
viewof pointerX
)
Insert cell
Insert cell
data = viz? ({frozen: frozen, ...viz }): null
Insert cell
detectFrozen = (element, frozen, pointerX) => {
element.addEventListener("pointerdown", e => {
//console.log(pointerX, e.offsetX);
if(!((frozen.value) && (pointerX.value == e.offsetX))) set(frozen, !frozen.value)
set(pointerX, e.offsetX)
}, {capture: true});
return element
}
Insert cell
import {set} from "@observablehq/synchronized-inputs"
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