1
2
3
4
5 package moreland_test
6
7 import (
8 "log"
9 "math"
10 "os"
11 "testing"
12
13 "gonum.org/v1/gonum/mat"
14 "gonum.org/v1/plot"
15 "gonum.org/v1/plot/cmpimg"
16 "gonum.org/v1/plot/palette"
17 "gonum.org/v1/plot/palette/moreland"
18 "gonum.org/v1/plot/plotter"
19 "gonum.org/v1/plot/vg"
20 "gonum.org/v1/plot/vg/draw"
21 "gonum.org/v1/plot/vg/vgimg"
22 )
23
24 type offsetUnitGrid struct {
25 XOffset, YOffset float64
26
27 Data *mat.Dense
28 }
29
30 func (g offsetUnitGrid) Dims() (c, r int) { r, c = g.Data.Dims(); return c, r }
31 func (g offsetUnitGrid) Z(c, r int) float64 { return g.Data.At(r, c) }
32 func (g offsetUnitGrid) X(c int) float64 {
33 _, n := g.Data.Dims()
34 if c < 0 || n <= c {
35 panic("index out of range")
36 }
37 return float64(c) + g.XOffset
38 }
39 func (g offsetUnitGrid) Y(r int) float64 {
40 m, _ := g.Data.Dims()
41 if r < 0 || m <= r {
42 panic("index out of range")
43 }
44 return float64(r) + g.YOffset
45 }
46
47
48
49
50 func Example() {
51 m := offsetUnitGrid{
52 XOffset: -50,
53 YOffset: -50,
54 Data: mat.NewDense(100, 100, nil),
55 }
56 for i := 0; i < 100; i++ {
57 for j := 0; j < 100; j++ {
58 x := float64(i-50) / 10
59 y := float64(j-50) / 10
60 v := math.Sin(x*x+y*y) / (x*x + y*y)
61 m.Data.Set(i, j, v)
62 }
63 }
64
65 const (
66 rows = 3
67 cols = 3
68 )
69 c := vgimg.New(vg.Points(800), vg.Points(800))
70 dc := draw.New(c)
71 tiles := draw.Tiles{
72 Rows: rows,
73 Cols: cols,
74 }
75 type paletteHolder struct {
76 name string
77 cmap palette.Palette
78 }
79 palettes := []paletteHolder{
80 {
81 name: "SmoothBlueRed",
82 cmap: moreland.SmoothBlueRed().Palette(255),
83 },
84 {
85 name: "SmoothBlueTan",
86 cmap: moreland.SmoothBlueTan().Palette(255),
87 },
88 {
89 name: "SmoothGreenPurple",
90 cmap: moreland.SmoothGreenPurple().Palette(255),
91 },
92 {
93 name: "SmoothGreenRed",
94 cmap: moreland.SmoothGreenRed().Palette(255),
95 },
96 {
97 name: "SmoothPurpleOrange",
98 cmap: moreland.SmoothPurpleOrange().Palette(255),
99 },
100 {
101 name: "BlackBody",
102 cmap: moreland.BlackBody().Palette(255),
103 },
104 {
105 name: "ExtendedBlackBody",
106 cmap: moreland.ExtendedBlackBody().Palette(255),
107 },
108 {
109 name: "Kindlmann",
110 cmap: moreland.Kindlmann().Palette(255),
111 },
112 {
113 name: "ExtendedKindlmann",
114 cmap: moreland.ExtendedKindlmann().Palette(255),
115 },
116 }
117
118 for i, plte := range palettes {
119
120 h := plotter.NewHeatMap(m, plte.cmap)
121
122 p := plot.New()
123 p.Title.Text = plte.name
124
125 p.Add(h)
126
127 p.X.Padding = 0
128 p.Y.Padding = 0
129 p.Draw(tiles.At(dc, i%cols, i/cols))
130 }
131
132 pngimg := vgimg.PngCanvas{Canvas: c}
133 f, err := os.Create("testdata/moreland.png")
134 if err != nil {
135 log.Panic(err)
136 }
137 if _, err = pngimg.WriteTo(f); err != nil {
138 log.Panic(err)
139 }
140 }
141
142 func TestHeatMap(t *testing.T) {
143 cmpimg.CheckPlot(Example, t, "moreland.png")
144 }
145
View as plain text