...

Source file src/gonum.org/v1/plot/vg/example_test.go

Documentation: gonum.org/v1/plot/vg

     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 vg_test
     6  
     7  import (
     8  	"archive/tar"
     9  	"bytes"
    10  	"compress/gzip"
    11  	"fmt"
    12  	"image/color"
    13  	"image/png"
    14  	"io"
    15  	"log"
    16  	"math"
    17  	"net/http"
    18  	"os"
    19  
    20  	"golang.org/x/image/font/opentype"
    21  
    22  	"gonum.org/v1/plot"
    23  	"gonum.org/v1/plot/font"
    24  	"gonum.org/v1/plot/plotter"
    25  	"gonum.org/v1/plot/vg"
    26  	"gonum.org/v1/plot/vg/draw"
    27  	"gonum.org/v1/plot/vg/vgimg"
    28  )
    29  
    30  func Example_addFont() {
    31  	// download font from debian
    32  	const url = "http://http.debian.net/debian/pool/main/f/fonts-ipafont/fonts-ipafont_00303.orig.tar.gz"
    33  
    34  	resp, err := http.Get(url)
    35  	if err != nil {
    36  		log.Fatalf("could not download IPA font file: %+v", err)
    37  	}
    38  	defer resp.Body.Close()
    39  
    40  	ttf, err := untargz("IPAfont00303/ipam.ttf", resp.Body)
    41  	if err != nil {
    42  		log.Fatalf("could not untar archive: %+v", err)
    43  	}
    44  
    45  	fontTTF, err := opentype.Parse(ttf)
    46  	if err != nil {
    47  		log.Fatal(err)
    48  	}
    49  	mincho := font.Font{Typeface: "Mincho"}
    50  	font.DefaultCache.Add([]font.Face{
    51  		{
    52  			Font: mincho,
    53  			Face: fontTTF,
    54  		},
    55  	})
    56  	if !font.DefaultCache.Has(mincho) {
    57  		log.Fatalf("no font %q!", mincho.Typeface)
    58  	}
    59  	plot.DefaultFont = mincho
    60  	plotter.DefaultFont = mincho
    61  
    62  	p := plot.New()
    63  	p.Title.Text = "Hello, 世界!"
    64  	p.X.Label.Text = "世"
    65  	p.Y.Label.Text = "界"
    66  
    67  	labels, err := plotter.NewLabels(
    68  		plotter.XYLabels{
    69  			XYs:    make(plotter.XYs, 1),
    70  			Labels: []string{"こんにちは世界"},
    71  		},
    72  	)
    73  	if err != nil {
    74  		log.Fatalf("could not create labels: %+v", err)
    75  	}
    76  	p.Add(labels)
    77  	p.Add(plotter.NewGrid())
    78  
    79  	err = p.Save(10*vg.Centimeter, 10*vg.Centimeter, "mincho-font.png")
    80  	if err != nil {
    81  		log.Fatalf("could not save plot: %+v", err)
    82  	}
    83  }
    84  
    85  func untargz(name string, r io.Reader) ([]byte, error) {
    86  	gr, err := gzip.NewReader(r)
    87  	if err != nil {
    88  		return nil, fmt.Errorf("could not create gzip reader: %v", err)
    89  	}
    90  	defer gr.Close()
    91  
    92  	tr := tar.NewReader(gr)
    93  	for {
    94  		hdr, err := tr.Next()
    95  		if err != nil {
    96  			if err == io.EOF {
    97  				return nil, fmt.Errorf("could not find %q in tar archive", name)
    98  			}
    99  			return nil, fmt.Errorf("could not extract header from tar archive: %v", err)
   100  		}
   101  
   102  		if hdr == nil || hdr.Name != name {
   103  			continue
   104  		}
   105  
   106  		buf := new(bytes.Buffer)
   107  		_, err = io.Copy(buf, tr)
   108  		if err != nil {
   109  			return nil, fmt.Errorf("could not extract %q file from tar archive: %v", name, err)
   110  		}
   111  		return buf.Bytes(), nil
   112  	}
   113  }
   114  
   115  func Example_inMemoryCanvas() {
   116  	p := plot.New()
   117  	p.Title.Text = "sin(x)"
   118  	p.X.Label.Text = "x"
   119  	p.Y.Label.Text = "f(x)"
   120  
   121  	p.X.Min = -2 * math.Pi
   122  	p.X.Max = +2 * math.Pi
   123  
   124  	fct := plotter.NewFunction(func(x float64) float64 {
   125  		return math.Sin(x)
   126  	})
   127  	fct.Color = color.RGBA{R: 255, A: 255}
   128  
   129  	p.Add(fct, plotter.NewGrid())
   130  
   131  	c := vgimg.New(10*vg.Centimeter, 5*vg.Centimeter)
   132  	p.Draw(draw.New(c))
   133  
   134  	// Save image.
   135  	f, err := os.Create("testdata/sine.png")
   136  	if err != nil {
   137  		log.Fatalf("could not create output image file: %+v", err)
   138  	}
   139  	defer f.Close()
   140  
   141  	err = png.Encode(f, c.Image())
   142  	if err != nil {
   143  		log.Fatalf("could not encode image to PNG: %+v", err)
   144  	}
   145  
   146  	err = f.Close()
   147  	if err != nil {
   148  		log.Fatalf("could not close output image file: %+v", err)
   149  	}
   150  }
   151  
   152  func Example_writerToCanvas() {
   153  	p := plot.New()
   154  	p.Title.Text = "cos(x)"
   155  	p.X.Label.Text = "x"
   156  	p.Y.Label.Text = "f(x)"
   157  
   158  	p.X.Min = -2 * math.Pi
   159  	p.X.Max = +2 * math.Pi
   160  
   161  	fct := plotter.NewFunction(func(x float64) float64 {
   162  		return math.Cos(x)
   163  	})
   164  	fct.Color = color.RGBA{B: 255, A: 255}
   165  
   166  	p.Add(fct, plotter.NewGrid())
   167  
   168  	c := vgimg.PngCanvas{
   169  		Canvas: vgimg.New(10*vg.Centimeter, 5*vg.Centimeter),
   170  	}
   171  	p.Draw(draw.New(c))
   172  
   173  	// Save image.
   174  	f, err := os.Create("testdata/cosine.png")
   175  	if err != nil {
   176  		log.Fatalf("could not create output image file: %+v", err)
   177  	}
   178  	defer f.Close()
   179  
   180  	_, err = c.WriteTo(f)
   181  	if err != nil {
   182  		log.Fatalf("could not encode image to PNG: %+v", err)
   183  	}
   184  
   185  	err = f.Close()
   186  	if err != nil {
   187  		log.Fatalf("could not close output image file: %+v", err)
   188  	}
   189  }
   190  

View as plain text