Move drawing logic to drawers

Close #1106.
Curious on why we need to generate a new array instead of just querying this.datasets()