Earnings versus the cost of living

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.