plot = {
const hover = vl
.selectSingle()
.encodings("x")
.on("mouseover")
.nearest(true)
.empty("none");
const line = vl
.markLine()
.encode(
vl.x().fieldT("date"),
vl.y().fieldQ("price").scale({ type: "log" }),
vl.color().fieldN("symbol")
);
const base = line.transform(vl.filter(hover));
const label = { align: "left", dx: 5, dy: -5 };
const white = { stroke: "white", strokeWidth: 2 };
return vl
.layer(
line,
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("price")),
base.markText(label).encode(vl.text().fieldQ("price"))
)
.width(300)
.height(100)
.facet(vl.fieldN("symbol"))
.columns(2)
.data("data/stocks.csv")
.render();
}