// AddScatters adds Scatter plotters to a plot. // The variadic arguments must be either strings // or plotter.XYers. Each plotter.XYer is added to // the plot using the next color, and glyph shape // via the Color and Shape functions. If a // plotter.XYer is immediately preceeded by // a string then a legend entry is added to the plot // using the string as the name. // // If an error occurs then none of the plotters are added // to the plot, and the error is returned. func AddScatters(plt *plot.Plot, vs ...interface{}) error { var ps []plot.Plotter names := make(map[*plotter.Scatter]string) name := "" var i int for _, v := range vs { switch t := v.(type) { case string: name = t case plotter.XYer: s, err := plotter.NewScatter(t) if err != nil { return err } s.Color = Color(i) s.Shape = Shape(i) i++ ps = append(ps, s) if name != "" { names[s] = name name = "" } default: panic(fmt.Sprintf("AddScatters handles strings and plotter.XYers, got %T", t)) } } plt.Add(ps...) for p, n := range names { plt.Legend.Add(n, p) } return nil }
func TestIssue179(t *testing.T) { scatter, err := plotter.NewScatter(plotter.XYs{{1, 1}, {0, 1}, {0, 0}}) if err != nil { log.Fatal(err) } p, err := plot.New() if err != nil { log.Fatal(err) } p.Add(scatter) p.HideAxes() c := vgimg.JpegCanvas{Canvas: vgimg.New(5.08*vg.Centimeter, 5.08*vg.Centimeter)} p.Draw(draw.New(c)) b := bytes.NewBuffer([]byte{}) if _, err = c.WriteTo(b); err != nil { t.Error(err) } f, err := os.Open(filepath.Join("testdata", "issue179.jpg")) if err != nil { t.Error(err) } defer f.Close() want, err := ioutil.ReadAll(f) if err != nil { t.Error(err) } if !bytes.Equal(b.Bytes(), want) { t.Error("Image mismatch") } }
func TestIssue179(t *testing.T) { t.Skip("github.com/BurntSushi/xgbutil#30 issue not fixed") if !hasX11() { t.Skip("no X11 environment") } scatter, err := plotter.NewScatter(plotter.XYs{{1, 1}, {0, 1}, {0, 0}}) if err != nil { t.Fatalf("error: %v\n", err) } p, err := plot.New() if err != nil { t.Fatalf("error: %v\n", err) } p.Add(scatter) p.HideAxes() c, err := New(5.08*vg.Centimeter, 5.08*vg.Centimeter, "test issue179") if err != nil { t.Fatalf("error: %v\n", err) } p.Draw(draw.New(c)) b := bytes.NewBuffer([]byte{}) err = jpeg.Encode(b, c.ximg, nil) if err != nil { t.Error(err) } f, err := os.Open(filepath.Join("..", "vgimg", "testdata", "issue179.jpg")) if err != nil { t.Error(err) } defer f.Close() want, err := ioutil.ReadAll(f) if err != nil { t.Error(err) } if !bytes.Equal(b.Bytes(), want) { t.Error("Image mismatch") } }
func TestPersistency(t *testing.T) { // Get some random points rand.Seed(0) // The default random seed is 1. n := 15 scatterData := randomPoints(n) lineData := randomPoints(n) linePointsData := randomPoints(n) p, err := plot.New() if err != nil { t.Fatalf("error creating plot: %v\n", err) } p.Title.Text = "Plot Example" p.X.Label.Text = "X" p.Y.Label.Text = "Y" // Use a custom tick marker function that computes the default // tick marks and re-labels the major ticks with commas. p.Y.Tick.Marker = commaTicks{} // Draw a grid behind the data p.Add(plotter.NewGrid()) // Make a scatter plotter and set its style. s, err := plotter.NewScatter(scatterData) if err != nil { panic(err) } s.GlyphStyle.Color = color.RGBA{R: 255, B: 128, A: 255} // Make a line plotter and set its style. l, err := plotter.NewLine(lineData) if err != nil { panic(err) } l.LineStyle.Width = vg.Points(1) l.LineStyle.Dashes = []vg.Length{vg.Points(5), vg.Points(5)} l.LineStyle.Color = color.RGBA{B: 255, A: 255} // Make a line plotter with points and set its style. lpLine, lpPoints, err := plotter.NewLinePoints(linePointsData) if err != nil { panic(err) } lpLine.Color = color.RGBA{G: 255, A: 255} lpPoints.Shape = draw.PyramidGlyph{} lpPoints.Color = color.RGBA{R: 255, A: 255} // Add the plotters to the plot, with a legend // entry for each p.Add(s, l, lpLine, lpPoints) p.Legend.Add("scatter", s) p.Legend.Add("line", l) p.Legend.Add("line points", lpLine, lpPoints) // Save the plot to a PNG file. err = p.Save(4, 4, "test-persistency.png") if err != nil { t.Fatalf("error saving to PNG: %v\n", err) } defer os.Remove("test-persistency.png") buf := new(bytes.Buffer) enc := gob.NewEncoder(buf) err = enc.Encode(p) if err != nil { t.Fatalf("error gob-encoding plot: %v\n", err) } // TODO(sbinet): impl. BinaryMarshal for plot.Plot and vg.Font // { // dec := gob.NewDecoder(buf) // var p plot.Plot // err = dec.Decode(&p) // if err != nil { // t.Fatalf("error gob-decoding plot: %v\n", err) // } // // Save the plot to a PNG file. // err = p.Save(4, 4, "test-persistency-readback.png") // if err != nil { // t.Fatalf("error saving to PNG: %v\n", err) // } // defer os.Remove("test-persistency-readback.png") // } }