...

Source file src/gonum.org/v1/plot/plotter/labels_test.go

Documentation: gonum.org/v1/plot/plotter

     1  // Copyright ©2020 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 plotter_test
     6  
     7  import (
     8  	"image/color"
     9  	"testing"
    10  
    11  	"gonum.org/v1/plot"
    12  	"gonum.org/v1/plot/cmpimg"
    13  	"gonum.org/v1/plot/plotter"
    14  	"gonum.org/v1/plot/vg"
    15  	"gonum.org/v1/plot/vg/draw"
    16  )
    17  
    18  func TestLabels(t *testing.T) {
    19  	cmpimg.CheckPlot(ExampleLabels, t, "labels.png")
    20  	cmpimg.CheckPlot(ExampleLabels_inCanvasCoordinates, t, "labels_cnv_coords.png")
    21  }
    22  
    23  // TestLabelsWithGlyphBoxes tests the position of the glyphbox around
    24  // a block of text, checking whether we correctly take into account
    25  // the descent+ascent of a glyph.
    26  func TestLabelsWithGlyphBoxes(t *testing.T) {
    27  	cmpimg.CheckPlot(
    28  		func() {
    29  			const fontSize = 24
    30  
    31  			p := plot.New()
    32  			p.Title.Text = "Labels"
    33  			p.X.Min = -1
    34  			p.X.Max = +1
    35  			p.Y.Min = -1
    36  			p.Y.Max = +1
    37  
    38  			const (
    39  				left   = 0.00
    40  				middle = 0.02
    41  				right  = 0.04
    42  			)
    43  
    44  			labels, err := plotter.NewLabels(plotter.XYLabels{
    45  				XYs: []plotter.XY{
    46  					{X: -0.8 + left, Y: -0.5},   // Aq + y-align bottom
    47  					{X: -0.6 + middle, Y: -0.5}, // Aq + y-align center
    48  					{X: -0.4 + right, Y: -0.5},  // Aq + y-align top
    49  
    50  					{X: -0.8 + left, Y: +0.5}, // ditto for Aq\nAq
    51  					{X: -0.6 + middle, Y: +0.5},
    52  					{X: -0.4 + right, Y: +0.5},
    53  
    54  					{X: +0.0 + left, Y: +0}, // ditto for Bg\nBg\nBg
    55  					{X: +0.2 + middle, Y: +0},
    56  					{X: +0.4 + right, Y: +0},
    57  				},
    58  				Labels: []string{
    59  					"Aq", "Aq", "Aq",
    60  					"Aq\nAq", "Aq\nAq", "Aq\nAq",
    61  
    62  					"Bg\nBg\nBg",
    63  					"Bg\nBg\nBg",
    64  					"Bg\nBg\nBg",
    65  				},
    66  			})
    67  			if err != nil {
    68  				t.Fatalf("could not creates labels plotter: %+v", err)
    69  			}
    70  			for i := range labels.TextStyle {
    71  				sty := &labels.TextStyle[i]
    72  				sty.Font.Size = vg.Length(fontSize)
    73  			}
    74  			labels.TextStyle[0].YAlign = draw.YBottom
    75  			labels.TextStyle[1].YAlign = draw.YCenter
    76  			labels.TextStyle[2].YAlign = draw.YTop
    77  
    78  			labels.TextStyle[3].YAlign = draw.YBottom
    79  			labels.TextStyle[4].YAlign = draw.YCenter
    80  			labels.TextStyle[5].YAlign = draw.YTop
    81  
    82  			labels.TextStyle[6].YAlign = draw.YBottom
    83  			labels.TextStyle[7].YAlign = draw.YCenter
    84  			labels.TextStyle[8].YAlign = draw.YTop
    85  
    86  			lred, err := plotter.NewLabels(plotter.XYLabels{
    87  				XYs: []plotter.XY{
    88  					{X: -0.8 + left, Y: +0.5},
    89  					{X: +0.0 + left, Y: +0},
    90  				},
    91  				Labels: []string{
    92  					"Aq", "Bg",
    93  				},
    94  			})
    95  			if err != nil {
    96  				t.Fatalf("could not creates labels plotter: %+v", err)
    97  			}
    98  			for i := range lred.TextStyle {
    99  				sty := &lred.TextStyle[i]
   100  				sty.Font.Size = vg.Length(fontSize)
   101  				sty.Color = color.RGBA{R: 255, A: 255}
   102  				sty.YAlign = draw.YBottom
   103  			}
   104  
   105  			// label with positive x/y-offsets
   106  			loffp, err := plotter.NewLabels(plotter.XYLabels{
   107  				XYs:    []plotter.XY{{X: left}},
   108  				Labels: []string{"Bg"},
   109  			})
   110  			if err != nil {
   111  				t.Fatalf("could not creates labels plotter: %+v", err)
   112  			}
   113  			for i := range loffp.TextStyle {
   114  				sty := &loffp.TextStyle[i]
   115  				sty.Font.Size = vg.Length(fontSize)
   116  				sty.Color = color.RGBA{G: 255, A: 255}
   117  			}
   118  			loffp.Offset = vg.Point{X: 75, Y: 75}
   119  
   120  			// label with negative x/y-offsets
   121  			loffm, err := plotter.NewLabels(plotter.XYLabels{
   122  				XYs:    []plotter.XY{{X: left}},
   123  				Labels: []string{"Bg"},
   124  			})
   125  			if err != nil {
   126  				t.Fatalf("could not creates labels plotter: %+v", err)
   127  			}
   128  			for i := range loffm.TextStyle {
   129  				sty := &loffm.TextStyle[i]
   130  				sty.Font.Size = vg.Length(fontSize)
   131  				sty.Color = color.RGBA{B: 255, A: 255}
   132  			}
   133  			loffm.Offset = vg.Point{X: -40, Y: -40}
   134  
   135  			m5 := plotter.NewFunction(func(float64) float64 { return -0.5 })
   136  			m5.LineStyle.Color = color.RGBA{R: 255, A: 255}
   137  
   138  			l0 := plotter.NewFunction(func(float64) float64 { return 0 })
   139  			l0.LineStyle.Color = color.RGBA{G: 255, A: 255}
   140  
   141  			p5 := plotter.NewFunction(func(float64) float64 { return +0.5 })
   142  			p5.LineStyle.Color = color.RGBA{B: 255, A: 255}
   143  
   144  			p.Add(labels, lred, m5, l0, p5, loffp, loffm)
   145  			p.Add(plotter.NewGrid())
   146  			p.Add(plotter.NewGlyphBoxes())
   147  
   148  			err = p.Save(10*vg.Centimeter, 10*vg.Centimeter, "testdata/labels_glyphboxes.png")
   149  			if err != nil {
   150  				t.Fatalf("could save plot: %+v", err)
   151  			}
   152  		},
   153  		t, "labels_glyphboxes.png",
   154  	)
   155  }
   156  

View as plain text