In general code looks good!
One note about the pattern we can see above:
```javascript
vis.selectAll("g.annotation").remove();
vis.selectAll("g.annotation")
  .data(annotations)
  .enter()
  (...)
```
I think it somehow contradicts d3 philosophy. We use library that provides sophisticated data binding (d3) just to remove all elements first and then add all of them again. I'm absolutely not surprised I can see it here, as this pattern widely spread across the whole Lab and grapher code base. It's absolutely not specific to Will's code, it's rather general note about **our** utilization of d3 (as we do code review). Perhaps more efficient way (no need to remove and recreate all elements) would be to:
```javascript
var annotations = vis.selectAll("g.annotation").data(annotations);
// enter
annotations.enter()
   .append("g")
   (...)
// exit
annotations.exit().remove();
// update
annotations
   .attr(...)
   (...)
```

It's rather pedantic note (especially taking into account rest of the grapher code) and I don't think it will have significant impact on the real performance. However if it's easy to change and doesn't cause any problems, maybe it's worth to do that.