1
2
3
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
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
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
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