A simple bit of caching would avoid the need to do work on each draw call, so that doesn't bother me.

Not getting an error until we're in the draw loop does bother me somewhat because in an interactive plot it leaves the program running in a weird limbo state. We could maintain the fail-early characteristic by supplying the projection to the constructor...?