Ah, I get it now. For some reason, I thought that adding to the margin would allow the whole bubble to show, but it is still clipped.
I would also think that clipPadding should help, but that doesn't seem to do what it says: although this parameter affects the size of the clipping rect, the rect is still aligned to the upper left, rather than adding to the clipping area on all sides (as documented) or aligned to the origin (probably the most helpful option, at least for this use-case).
The easiest workaround I could find was simply to remove the clipping path in a renderlet:
.renderlet(function(chart) {
chart.svg().select('.chart-body').attr('clip-path', null)
});
Of course, if you have dots below or left of the origin, that will probably not be acceptable.
I filed an issue here:
There was an earlier issue with a less general solution: