Each bubble is a city: average income across the bottom, cost of living up the side, sized by population.
plotOptions.unit.scatter.y: 'value' switches the scatter layout
to a 2D value-value plot: each datum's own x and y
on two drawn numeric axes, coloured by category. scatter.sizeRange
turns the dots into bubbles scaled by area from each datum's
sizeField (here z). Switching the size metric is a
plain chart.updateSeries(), so every bubble tweens its radius;
hiding a region from the legend fades its bubbles out in place. The unit
chart is a premium type; without a license it renders with a trial watermark.
Figures are approximate.