-
Notifications
You must be signed in to change notification settings - Fork 204
/
heat_test.go
116 lines (100 loc) · 2.37 KB
/
heat_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Copyright ©2015 The gonum Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package plotter
import (
"fmt"
"log"
"testing"
"github.com/gonum/matrix/mat64"
"github.com/gonum/plot"
"github.com/gonum/plot/internal/cmpimg"
"github.com/gonum/plot/palette"
"github.com/gonum/plot/vg/draw"
"github.com/gonum/plot/vg/recorder"
)
type offsetUnitGrid struct {
XOffset, YOffset float64
Data mat64.Matrix
}
func (g offsetUnitGrid) Dims() (c, r int) { r, c = g.Data.Dims(); return c, r }
func (g offsetUnitGrid) Z(c, r int) float64 { return g.Data.At(r, c) }
func (g offsetUnitGrid) X(c int) float64 {
_, n := g.Data.Dims()
if c < 0 || c >= n {
panic("index out of range")
}
return float64(c) + g.XOffset
}
func (g offsetUnitGrid) Y(r int) float64 {
m, _ := g.Data.Dims()
if r < 0 || r >= m {
panic("index out of range")
}
return float64(r) + g.YOffset
}
func ExampleHeatMap() {
m := offsetUnitGrid{
XOffset: -2,
YOffset: -1,
Data: mat64.NewDense(3, 4, []float64{
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
})}
plte := palette.Heat(12, 1)
h := NewHeatMap(m, plte)
p, err := plot.New()
if err != nil {
log.Panic(err)
}
p.Title.Text = "Heat map"
p.Add(h)
// Create a legend.
rng := h.Max - h.Min
thumbs := PaletteThumbnailers(plte)
for i := len(thumbs) - 1; i >= 0; i-- {
t := thumbs[i]
fmin := float64(i) / float64(len(thumbs))
fmax := float64(i+1) / float64(len(thumbs))
p.Legend.Add(fmt.Sprintf("%.2g - %.2g", h.Min+fmin*rng, h.Min+fmax*rng), t)
}
p.X.Padding = 0
p.Y.Padding = 0
p.X.Max = 1.5
p.Y.Max = 1.5
err = p.Save(100, 100, "testdata/heatMap.png")
if err != nil {
log.Panic(err)
}
}
func TestHeatMap(t *testing.T) {
cmpimg.CheckPlot(ExampleHeatMap, t, "heatMap.png")
}
func TestFlatHeat(t *testing.T) {
m := offsetUnitGrid{
XOffset: -2,
YOffset: -1,
Data: mat64.NewDense(3, 4, nil),
}
h := NewHeatMap(m, palette.Heat(12, 1))
p, err := plot.New()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
p.Add(h)
func() {
defer func() {
r := recover()
if r == nil {
t.Error("expected panic for flat data")
}
const want = "heatmap: non-positive Z range"
if r != want {
t.Errorf("unexpected panic message: got:%q want:%q", r, want)
}
}()
c := draw.NewCanvas(new(recorder.Canvas), 72, 72)
p.Draw(c)
}()
}