{
const selectBrush = vl.selectInterval().encodings("x", "y");
const selectOrigin = vl.selectPoint().fields(["Origin"]);
const selectHover = vl
.selectPoint("hover")
.on("mouseover")
.nearest(true)
.clear("mouseout");
const selectAnd = vl.and(selectBrush, selectOrigin);
const baseEncoding = {
x: vl
.x()
.fieldQ("Horsepower")
.scale({ domain: [0, 300] }),
y: vl
.y()
.fieldQ("Miles_per_Gallon")
.scale({ domain: [0, 50] }),
color: vl.color().fieldN("Origin").scale({ range: colors3 }),
opacity: vl.opacity().if(selectAnd, vl.value(1.0)).value(0.2)
};
const layer1 = vl
.markCircle()
.data(cars)
.params(selectBrush, selectHover)
.encode(baseEncoding);
const layerHover = vl
.markCircle({ stroke: "black", strokeWidth: 1, fill: null })
.data(cars)
.transform(vl.filter(selectHover))
.encode({
x: baseEncoding.x,
y: baseEncoding.y,
tooltip: vl.tooltip(["Name", "Horsepower", "Miles_per_Gallon", "Origin"])
});
const plot1 = vl.layer(layer1, layerHover);
const plot2 = vl
.markBar()
.data(cars)
.params(selectOrigin)
.encode(
vl.y().fieldN("Origin"),
vl
.x()
.count()
.scale({ domain: [0, 300] }),
vl.color().fieldN("Origin").scale({ range: colors3 }),
vl.opacity().if(selectOrigin, vl.value(1.0)).value(0.2)
);
return vl.vconcat(plot1, plot2).render();
}