...
1
2
3
4
5 package plotter
6
7 import (
8 "image"
9
10 "gonum.org/v1/plot"
11 "gonum.org/v1/plot/palette"
12 "gonum.org/v1/plot/vg/draw"
13 )
14
15
16 type ColorBar struct {
17 ColorMap palette.ColorMap
18
19
20
21
22 Vertical bool
23
24
25
26
27 Colors int
28 }
29
30
31
32
33 func (l *ColorBar) colors(c draw.Canvas) int {
34 if l.Colors > 0 {
35 return l.Colors
36 }
37 if l.Vertical {
38 return int(c.Max.Y - c.Min.Y)
39 }
40 return int(c.Max.X - c.Min.X)
41 }
42
43
44
45 func (l *ColorBar) check() {
46 if l.ColorMap == nil {
47 panic("plotter: nil ColorMap in ColorBar")
48 }
49 if l.ColorMap.Max() == l.ColorMap.Min() {
50 panic("plotter: ColorMap Max==Min")
51 }
52 }
53
54
55 func (l *ColorBar) Plot(c draw.Canvas, p *plot.Plot) {
56 l.check()
57 colors := l.colors(c)
58 var pImg *Image
59 delta := (l.ColorMap.Max() - l.ColorMap.Min()) / float64(colors)
60 if l.Vertical {
61 img := image.NewNRGBA64(image.Rectangle{
62 Min: image.Point{X: 0, Y: 0},
63 Max: image.Point{X: 1, Y: colors},
64 })
65 for i := 0; i < colors; i++ {
66 color, err := l.ColorMap.At(l.ColorMap.Min() + delta*float64(i))
67 if err != nil {
68 panic(err)
69 }
70 img.Set(0, colors-1-i, color)
71 }
72 pImg = NewImage(img, 0, l.ColorMap.Min(), 1, l.ColorMap.Max())
73 } else {
74 img := image.NewNRGBA64(image.Rectangle{
75 Min: image.Point{X: 0, Y: 0},
76 Max: image.Point{X: colors, Y: 1},
77 })
78 for i := 0; i < colors; i++ {
79 color, err := l.ColorMap.At(l.ColorMap.Min() + delta*float64(i))
80 if err != nil {
81 panic(err)
82 }
83 img.Set(i, 0, color)
84 }
85 pImg = NewImage(img, l.ColorMap.Min(), 0, l.ColorMap.Max(), 1)
86 }
87 pImg.Plot(c, p)
88 }
89
90
91
92 func (l *ColorBar) DataRange() (xmin, xmax, ymin, ymax float64) {
93 l.check()
94 if l.Vertical {
95 return 0, 1, l.ColorMap.Min(), l.ColorMap.Max()
96 }
97 return l.ColorMap.Min(), l.ColorMap.Max(), 0, 1
98 }
99
View as plain text