gonum/plot

Implement vgimg.SvgCanvas

jurisbu opened this issue · 3 comments

What are you trying to do?

For reasons of symmetry and discover-ability one might want to have vgimg.SvgCanvas.

Canonical example of multi-figure plots via plot.Align uses vgimg.PngCanvas to save "plot". In case user of package wants to save in SVG format there is no easily discover-able path to achieve this goal. One would assume there should exist vgimg.SvgCanvas since there exist vgimg.PngCanvas, vgimg.JpegCanvas and vgimg.TiffCanvas.

What version of Go and Gonum/plot are you using?

	gonum.org/v1/gonum v0.9.3
	gonum.org/v1/plot v0.10.0

there's already a vgsvg.Canvas:

and vgpdf.Canvas, vgeps.Canvas, vgtex.Canvas and vggio.Canvas.

vgimg holds PngCanvas, JpegCanvas and TiffCanvas because they all work off an image.Image (thus the img in vgimg).

IMHO, vgimg.SvgCanvas wouldn't fit into vgimg.

that said, one could imagine having a set of "hello world" examples of plots for each of the vgxxx backends, available from gonum.org/v1/plot.
(also perhaps a few more words about vg, vg/vgxxx backends and the overall architecture of gonum/plot in its top-level documentation)

WDYT?

@sbinet Thanks for pointing out where to look into. I will have to look into how to transform plot.Align example to work similar as *plot.Plot.Save() works so that appropriate canvas is used depending on provided file extension.

Just a side note: too many Canvas I guess 😄 My head is spinning, it is rather hard to figure out as an outsider and a humble package user. I can see how it works quite well for authors of package that know ins and outs.

you'd just have to replace:

img := vgimg.New(vg.Points(150), vg.Points(175))

with:

svg := vgsvg.New(vg.Points(150), vg.Points(175))

and, further down:

if _, err := png.WriteTo(w); err != nil {

with:

if _, err := svg.WriteTo(w); err != nil {