...
1
2
3
4
5 package plotutil
6
7 import (
8 "math"
9 "sort"
10
11 "gonum.org/v1/plot/plotter"
12 )
13
14
15
16 type ErrorPoints struct {
17 plotter.XYs
18 plotter.XErrors
19 plotter.YErrors
20 }
21
22
23
24
25
26
27
28
29
30
31
32 func NewErrorPoints(f func([]float64) (c, l, h float64), pts ...plotter.XYer) (*ErrorPoints, error) {
33
34 c := &ErrorPoints{
35 XYs: make(plotter.XYs, len(pts)),
36 XErrors: make(plotter.XErrors, len(pts)),
37 YErrors: make(plotter.YErrors, len(pts)),
38 }
39
40 for i, xy := range pts {
41 xs := make([]float64, xy.Len())
42 ys := make([]float64, xy.Len())
43 for j := 0; j < xy.Len(); j++ {
44 xs[j], ys[j] = xy.XY(j)
45 if err := plotter.CheckFloats(xs[j], ys[j]); err != nil {
46 return nil, err
47 }
48 }
49 c.XYs[i].X, c.XErrors[i].Low, c.XErrors[i].High = f(xs)
50 if err := plotter.CheckFloats(c.XYs[i].X, c.XErrors[i].Low, c.XErrors[i].High); err != nil {
51 return nil, err
52 }
53 c.XYs[i].Y, c.YErrors[i].Low, c.YErrors[i].High = f(ys)
54 if err := plotter.CheckFloats(c.XYs[i].Y, c.YErrors[i].Low, c.YErrors[i].High); err != nil {
55 return nil, err
56 }
57 }
58
59 return c, nil
60 }
61
62
63
64
65
66
67
68
69 func MeanAndConf95(vls []float64) (mean, lowerr, higherr float64) {
70 n := float64(len(vls))
71
72 sum := 0.0
73 for _, v := range vls {
74 sum += v
75 }
76 mean = sum / n
77
78 sum = 0.0
79 for _, v := range vls {
80 diff := v - mean
81 sum += diff * diff
82 }
83 stdev := math.Sqrt(sum / n)
84
85 conf := 1.96 * stdev / math.Sqrt(n)
86 return mean, conf, conf
87 }
88
89
90
91
92
93
94
95
96 func MedianAndMinMax(vls []float64) (med, lowerr, higherr float64) {
97 n := len(vls)
98 if n == 0 {
99 panic("plotutil: MedianAndMinMax: No values")
100 }
101 if n == 1 {
102 return vls[0], 0, 0
103 }
104 sort.Float64s(vls)
105 if n%2 == 0 {
106 med = (vls[n/2]-vls[n/2-1])/2 + vls[n/2-1]
107 } else {
108 med = vls[n/2]
109 }
110
111 min := vls[0]
112 max := vls[0]
113 for _, v := range vls {
114 min = math.Min(min, v)
115 max = math.Max(max, v)
116 }
117
118 return med, med - min, max - med
119 }
120
View as plain text