When I began my start-up, I knew the product was going to focus heavily on drawing high-quality graphs, so I spent quite a while looking at the various options.
Server Side Rendering
The first option, and the one that’s been around the longest, is to do all the rendering on the server and then send the resulting images back to the client. This is essentially what the Google Maps did (though they’ve added more and more client-rendered elements over the years). To do this, you’ll need some kind of image rendering environment on the server (e.g., Java2D), and, of course, a server capable of serving up the images thus produced.
I decided to skip this option because it adds latency and dramatically cuts down on interactivity and the ability to animation transitions. Both were very important to me, so this solution was clearly not a good fit.
While Canvas has the advantages of giving a lot more control on the client-side, you’re still stuck with a raster image which needs to be drawn from scratch for each change. You also lose the structure of the scene (since it’s all reduced to pixels), and therefore lose the functionality provided in the DOM (e.g., CSS and event handlers).
As an added incentive for using SVG, there is an excellent library called Data Driven Documents (D3) which provides an amazing resource for manipulating SVG documents with interactivity, animations, and a lot more. More than anything else, the existence of D3 decided me on using SVG for my custom graphic needs.