...

Source file src/gonum.org/v1/plot/plot_test.go

Documentation: gonum.org/v1/plot

     1  // Copyright ©2015 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package plot_test
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"image/color"
    11  	"math"
    12  	"os"
    13  	"testing"
    14  	"time"
    15  
    16  	"gonum.org/v1/plot"
    17  	"gonum.org/v1/plot/cmpimg"
    18  	"gonum.org/v1/plot/font"
    19  	"gonum.org/v1/plot/plotter"
    20  	"gonum.org/v1/plot/text"
    21  	"gonum.org/v1/plot/vg"
    22  	"gonum.org/v1/plot/vg/draw"
    23  	"gonum.org/v1/plot/vg/recorder"
    24  	"gonum.org/v1/plot/vg/vgimg"
    25  )
    26  
    27  func TestLegendAlignment(t *testing.T) {
    28  	l := plot.Legend{
    29  		ThumbnailWidth: vg.Points(20),
    30  		TextStyle: text.Style{
    31  			Font:    font.From(plot.DefaultFont, 10),
    32  			Handler: plot.DefaultTextHandler,
    33  		},
    34  	}
    35  	for i, n := range []string{"A", "B", "C", "D"} {
    36  		b, err := plotter.NewBarChart(plotter.Values{0}, 1)
    37  		if err != nil {
    38  			t.Fatalf("failed to create bar chart %q: %v", n, err)
    39  		}
    40  		b.Color = color.Gray{byte(i+1)*64 - 1}
    41  		l.Add(n, b)
    42  	}
    43  
    44  	c := vgimg.PngCanvas{Canvas: vgimg.New(5*vg.Centimeter, 5*vg.Centimeter)}
    45  	l.Draw(draw.New(c))
    46  	var buf bytes.Buffer
    47  	if _, err := c.WriteTo(&buf); err != nil {
    48  		t.Fatal(err)
    49  	}
    50  
    51  	if *cmpimg.GenerateTestData {
    52  		// Recreate Golden images and exit.
    53  		err := os.WriteFile("testdata/legendAlignment_golden.png", buf.Bytes(), 0o644)
    54  		if err != nil {
    55  			t.Fatal(err)
    56  		}
    57  		return
    58  	}
    59  
    60  	err := os.WriteFile("testdata/legendAlignment.png", buf.Bytes(), 0o644)
    61  	if err != nil {
    62  		t.Fatal(err)
    63  	}
    64  
    65  	want, err := os.ReadFile("testdata/legendAlignment_golden.png")
    66  	if err != nil {
    67  		t.Fatal(err)
    68  	}
    69  
    70  	ok, err := cmpimg.Equal("png", buf.Bytes(), want)
    71  	if err != nil {
    72  		t.Fatal(err)
    73  	}
    74  	if !ok {
    75  		t.Fatalf("images differ")
    76  	}
    77  
    78  }
    79  
    80  func TestIssue514(t *testing.T) {
    81  	for _, ulp := range []int{
    82  		0,
    83  		+1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22,
    84  		-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22,
    85  	} {
    86  		t.Run(fmt.Sprintf("ulps%+02d", ulp), func(t *testing.T) {
    87  			done := make(chan int)
    88  			go func() {
    89  				defer close(done)
    90  
    91  				p := plot.New()
    92  
    93  				var (
    94  					y1 = 100.0
    95  					y2 = y1
    96  				)
    97  
    98  				switch {
    99  				case ulp < 0:
   100  					y2 = math.Float64frombits(math.Float64bits(y1) - uint64(-ulp))
   101  				case ulp > 0:
   102  					y2 = math.Float64frombits(math.Float64bits(y1) + uint64(ulp))
   103  				}
   104  
   105  				pts, err := plotter.NewScatter(plotter.XYs{
   106  					{X: 1, Y: y1},
   107  					{X: 1, Y: y2},
   108  				})
   109  				if err != nil {
   110  					t.Errorf("could not create scatter: %v", err)
   111  					return
   112  				}
   113  
   114  				p.Add(pts)
   115  
   116  				c := draw.NewCanvas(&recorder.Canvas{}, 100, 100)
   117  				p.Draw(c)
   118  			}()
   119  
   120  			timeout := time.NewTimer(100 * time.Millisecond)
   121  			defer timeout.Stop()
   122  
   123  			select {
   124  			case <-done:
   125  			case <-timeout.C:
   126  				t.Fatalf("could not create plot with small axis range within allotted time")
   127  			}
   128  		})
   129  	}
   130  }
   131  
   132  func TestDrawGlyphBoxes(t *testing.T) {
   133  	cmpimg.CheckPlot(func() {
   134  		p := plot.New()
   135  
   136  		p.Title.Text = "My very very very\nlong Title"
   137  		p.X.Min = 0
   138  		p.X.Max = 10
   139  		p.Y.Min = 0
   140  		p.Y.Max = 10
   141  
   142  		p.X.Label.Text = "X-axis"
   143  		p.Y.Label.Text = "Y-axis"
   144  
   145  		f1 := plotter.NewFunction(func(x float64) float64 { return 5 })
   146  		f1.LineStyle.Color = color.RGBA{R: 255, A: 255}
   147  
   148  		f2 := plotter.NewFunction(func(x float64) float64 { return 6 })
   149  		f2.LineStyle.Color = color.RGBA{B: 255, A: 255}
   150  
   151  		labels, err := plotter.NewLabels(plotter.XYLabels{
   152  			XYs: []plotter.XY{
   153  				{X: 2.5, Y: 2.5},
   154  				{X: 7.5, Y: 2.5},
   155  				{X: 7.5, Y: 7.5},
   156  				{X: 2.5, Y: 7.5},
   157  			},
   158  			Labels: []string{"Agg", "Bgg", "Cgg", "Dgg"},
   159  		})
   160  		if err != nil {
   161  			t.Fatalf("could not creates labels plotter: %+v", err)
   162  		}
   163  
   164  		p.Add(f1, f2, labels)
   165  		p.Add(plotter.NewGrid())
   166  
   167  		p.Legend.Add("fg1", f1)
   168  		p.Legend.Add("fg2", f2)
   169  		p.Legend.Top = true
   170  
   171  		c := vgimg.PngCanvas{
   172  			Canvas: vgimg.New(20*vg.Centimeter, 15*vg.Centimeter),
   173  		}
   174  
   175  		d := draw.New(c)
   176  		p.Draw(d)
   177  		p.DrawGlyphBoxes(d)
   178  
   179  		buf := new(bytes.Buffer)
   180  		_, err = c.WriteTo(buf)
   181  		if err != nil {
   182  			t.Fatalf("error: %+v", err)
   183  		}
   184  
   185  		err = os.WriteFile("testdata/glyphbox.png", buf.Bytes(), 0644)
   186  		if err != nil {
   187  			t.Fatalf("could not save plot: %+v", err)
   188  		}
   189  	}, t, "glyphbox.png")
   190  }
   191  

View as plain text