...

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

Documentation: gonum.org/v1/plot/plotter

     1  // Copyright ©2019 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  	"image/png"
    10  	"log"
    11  	"math"
    12  	"os"
    13  
    14  	"gonum.org/v1/plot"
    15  	"gonum.org/v1/plot/palette/moreland"
    16  	"gonum.org/v1/plot/plotter"
    17  	"gonum.org/v1/plot/vg"
    18  	"gonum.org/v1/plot/vg/draw"
    19  	"gonum.org/v1/plot/vg/vgimg"
    20  )
    21  
    22  func ExampleField() {
    23  	f := plotter.NewField(field{
    24  		r: 17, c: 19,
    25  		fn: func(x, y float64) plotter.XY {
    26  			return plotter.XY{
    27  				X: y,
    28  				Y: -x,
    29  			}
    30  		},
    31  	})
    32  	f.LineStyle.Width = 0.2
    33  
    34  	p := plot.New()
    35  	p.Title.Text = "Vector field"
    36  	p.X.Tick.Marker = integerTicks{}
    37  	p.Y.Tick.Marker = integerTicks{}
    38  
    39  	p.Add(f)
    40  
    41  	img := vgimg.New(250, 175)
    42  	dc := draw.New(img)
    43  
    44  	p.Draw(dc)
    45  	w, err := os.Create("testdata/field.png")
    46  	if err != nil {
    47  		log.Panic(err)
    48  	}
    49  	png := vgimg.PngCanvas{Canvas: img}
    50  	if _, err = png.WriteTo(w); err != nil {
    51  		log.Panic(err)
    52  	}
    53  }
    54  
    55  func ExampleField_colors() {
    56  	f := plotter.NewField(field{
    57  		r: 5, c: 9,
    58  		fn: func(x, y float64) plotter.XY {
    59  			return plotter.XY{
    60  				X: -0.75*x + y,
    61  				Y: -0.75*y - x,
    62  			}
    63  		},
    64  	})
    65  
    66  	pal := moreland.ExtendedBlackBody()
    67  	pal.SetMin(0)
    68  	pal.SetMax(1.1) // Use 1.1 to make highest magnitude vectors visible on white.
    69  
    70  	// Provide a DrawGlyph function to render a custom
    71  	// vector instead of the default monochrome arrow.
    72  	f.DrawGlyph = func(c vg.Canvas, sty draw.LineStyle, v plotter.XY) {
    73  		c.Push()
    74  		defer c.Pop()
    75  		mag := math.Hypot(v.X, v.Y)
    76  		var pa vg.Path
    77  		if mag == 0 {
    78  			// Draw a black dot for zero vectors.
    79  			c.SetColor(color.Black)
    80  			pa.Move(vg.Point{X: sty.Width})
    81  			pa.Arc(vg.Point{}, sty.Width, 0, 2*math.Pi)
    82  			pa.Close()
    83  			c.Fill(pa)
    84  			return
    85  		}
    86  		// Choose a color from the palette for the magnitude.
    87  		col, err := pal.At(mag)
    88  		if err != nil {
    89  			panic(err)
    90  		}
    91  		c.SetColor(col)
    92  		pa.Move(vg.Point{})
    93  		pa.Line(vg.Point{X: 1, Y: 0})
    94  		pa.Close()
    95  		c.Stroke(pa)
    96  	}
    97  
    98  	p := plot.New()
    99  	p.Title.Text = "Vortex"
   100  	p.X.Tick.Marker = integerTicks{}
   101  	p.Y.Tick.Marker = integerTicks{}
   102  
   103  	p.Add(f)
   104  
   105  	img := vgimg.New(250, 175)
   106  	dc := draw.New(img)
   107  
   108  	p.Draw(dc)
   109  	w, err := os.Create("testdata/color_field.png")
   110  	if err != nil {
   111  		log.Panic(err)
   112  	}
   113  	defer w.Close()
   114  	png := vgimg.PngCanvas{Canvas: img}
   115  	if _, err = png.WriteTo(w); err != nil {
   116  		log.Panic(err)
   117  	}
   118  }
   119  
   120  func ExampleField_gophers() {
   121  	file, err := os.Open("testdata/gopher_running.png")
   122  	if err != nil {
   123  		log.Panic(err)
   124  	}
   125  	defer file.Close()
   126  	gopher, err := png.Decode(file)
   127  	if err != nil {
   128  		log.Panic(err)
   129  	}
   130  
   131  	f := plotter.NewField(field{
   132  		r: 5, c: 9,
   133  		fn: func(x, y float64) plotter.XY {
   134  			return plotter.XY{
   135  				X: -0.75*x + y,
   136  				Y: -0.75*y - x,
   137  			}
   138  		},
   139  	})
   140  
   141  	// Provide a DrawGlyph function to render a custom
   142  	// vector glyph instead of the default arrow.
   143  	f.DrawGlyph = func(c vg.Canvas, _ draw.LineStyle, v plotter.XY) {
   144  		// The canvas is unscaled if the vector has a zero
   145  		// magnitude, so return in that case.
   146  		if math.Hypot(v.X, v.Y) == 0 {
   147  			return
   148  		}
   149  		// Vector glyphs are scaled to half unit length by the
   150  		// plotter, so scale the gopher to twice unit size so
   151  		// it fits the cell, and center on the cell.
   152  		c.Translate(vg.Point{X: -1, Y: -1})
   153  		c.DrawImage(vg.Rectangle{Max: vg.Point{X: 2, Y: 2}}, gopher)
   154  	}
   155  
   156  	p := plot.New()
   157  	p.Title.Text = "Gopher vortex"
   158  	p.X.Tick.Marker = integerTicks{}
   159  	p.Y.Tick.Marker = integerTicks{}
   160  
   161  	p.Add(f)
   162  
   163  	img := vgimg.New(250, 175)
   164  	dc := draw.New(img)
   165  
   166  	p.Draw(dc)
   167  	w, err := os.Create("testdata/gopher_field.png")
   168  	if err != nil {
   169  		log.Panic(err)
   170  	}
   171  	png := vgimg.PngCanvas{Canvas: img}
   172  	if _, err = png.WriteTo(w); err != nil {
   173  		log.Panic(err)
   174  	}
   175  }
   176  

View as plain text