C3 looks nice, but it'd be really great if the library didn't demand passing things in object format. Why can't we have something that implements chaining like D3? It seems a bit counter-intuitive...
I actually prefer passing a declarative configuration object rather than issuing a series of API calls. It is one of the things that had me switch a project from D3 to C3 + crossfilter a while back.
I guess that depends on whether the settings you are passing to the chart are coming from somewhere else (say, an API call). If you can just get a JSON object from a backend and pass it directly to the chart, things become much simpler in your code.