1
2
3
4
5 package plotter_test
6
7 import (
8 "image/color"
9 "log"
10
11 "golang.org/x/exp/rand"
12
13 "gonum.org/v1/plot"
14 "gonum.org/v1/plot/plotter"
15 "gonum.org/v1/plot/vg"
16 )
17
18 func ExampleBarChart() {
19
20 values := plotter.Values{0.5, 10, 20, 30}
21 verticalLabels := []string{"A", "B", "C", "D"}
22 horizontalLabels := []string{"Label A", "Label B", "Label C", "Label D"}
23
24
25 p1 := plot.New()
26 verticalBarChart, err := plotter.NewBarChart(values, 0.5*vg.Centimeter)
27 if err != nil {
28 log.Panic(err)
29 }
30 p1.Add(verticalBarChart)
31 p1.NominalX(verticalLabels...)
32 err = p1.Save(100, 100, "testdata/verticalBarChart.png")
33 if err != nil {
34 log.Panic(err)
35 }
36
37
38 p2 := plot.New()
39 horizontalBarChart, err := plotter.NewBarChart(values, 0.5*vg.Centimeter)
40 horizontalBarChart.Horizontal = true
41 if err != nil {
42 log.Panic(err)
43 }
44 p2.Add(horizontalBarChart)
45 p2.NominalY(horizontalLabels...)
46 err = p2.Save(100, 100, "testdata/horizontalBarChart.png")
47 if err != nil {
48 log.Panic(err)
49 }
50
51
52 groupA := plotter.Values{20, 35, 30, 35, 27}
53 groupB := plotter.Values{25, 32, 34, 20, 25}
54 groupC := plotter.Values{12, 28, 15, 21, 8}
55 groupD := plotter.Values{30, 42, 6, 9, 12}
56
57 p := plot.New()
58 p.Title.Text = "Bar chart"
59 p.Y.Label.Text = "Heights"
60
61 w := vg.Points(8)
62
63 barsA, err := plotter.NewBarChart(groupA, w)
64 if err != nil {
65 log.Panic(err)
66 }
67 barsA.Color = color.RGBA{R: 255, A: 255}
68 barsA.Offset = -w / 2
69
70 barsB, err := plotter.NewBarChart(groupB, w)
71 if err != nil {
72 log.Panic(err)
73 }
74 barsB.Color = color.RGBA{R: 196, G: 196, A: 255}
75 barsB.Offset = w / 2
76
77 barsC, err := plotter.NewBarChart(groupC, w)
78 if err != nil {
79 log.Panic(err)
80 }
81 barsC.XMin = 6
82 barsC.Color = color.RGBA{B: 255, A: 255}
83 barsC.Offset = -w / 2
84
85 barsD, err := plotter.NewBarChart(groupD, w)
86 if err != nil {
87 log.Panic(err)
88 }
89 barsD.Color = color.RGBA{B: 255, R: 255, A: 255}
90 barsD.XMin = 6
91 barsD.Offset = w / 2
92
93 p.Add(barsA, barsB, barsC, barsD)
94 p.Legend.Add("A", barsA)
95 p.Legend.Add("B", barsB)
96 p.Legend.Add("C", barsC)
97 p.Legend.Add("D", barsD)
98 p.Legend.Top = true
99 p.NominalX("Zero", "One", "Two", "Three", "Four", "",
100 "Six", "Seven", "Eight", "Nine", "Ten")
101
102 p.Add(plotter.NewGlyphBoxes())
103 err = p.Save(300, 250, "testdata/barChart2.png")
104 if err != nil {
105 log.Panic(err)
106 }
107
108
109 p = plot.New()
110 p.Title.Text = "Bar chart"
111 p.Y.Label.Text = "Heights"
112
113 w = vg.Points(15)
114
115 barsA, err = plotter.NewBarChart(groupA, w)
116 if err != nil {
117 log.Panic(err)
118 }
119 barsA.Color = color.RGBA{R: 255, A: 255}
120 barsA.Offset = -w / 2
121
122 barsB, err = plotter.NewBarChart(groupB, w)
123 if err != nil {
124 log.Panic(err)
125 }
126 barsB.Color = color.RGBA{R: 196, G: 196, A: 255}
127 barsB.StackOn(barsA)
128
129 barsC, err = plotter.NewBarChart(groupC, w)
130 if err != nil {
131 log.Panic(err)
132 }
133 barsC.Offset = w / 2
134 barsC.Color = color.RGBA{B: 255, A: 255}
135
136 barsD, err = plotter.NewBarChart(groupD, w)
137 if err != nil {
138 log.Panic(err)
139 }
140 barsD.StackOn(barsC)
141 barsD.Color = color.RGBA{B: 255, R: 255, A: 255}
142
143 p.Add(barsA, barsB, barsC, barsD)
144 p.Legend.Add("A", barsA)
145 p.Legend.Add("B", barsB)
146 p.Legend.Add("C", barsC)
147 p.Legend.Add("D", barsD)
148 p.Legend.Top = true
149 p.NominalX("Zero", "One", "Two", "Three", "Four")
150
151 p.Add(plotter.NewGlyphBoxes())
152 err = p.Save(250, 250, "testdata/stackedBarChart.png")
153 if err != nil {
154 log.Panic(err)
155 }
156 }
157
158
159 func ExampleBarChart_positiveNegative() {
160 rnd := rand.New(rand.NewSource(1))
161
162
163 const n = 6
164 data1 := make(plotter.Values, n)
165 data2 := make(plotter.Values, n)
166 net := make(plotter.XYs, n)
167 for i := 0; i < n; i++ {
168 data1[i] = rnd.Float64()*2 - 1
169 data2[i] = rnd.Float64()*2 - 1
170 net[i].X = data1[i] + data2[i]
171 net[i].Y = float64(i)
172 }
173
174
175
176 splitBySign := func(d plotter.Values) (pos, neg plotter.Values) {
177 pos = make(plotter.Values, len(d))
178 neg = make(plotter.Values, len(d))
179 for i, v := range d {
180 if v > 0 {
181 pos[i] = v
182 } else {
183 neg[i] = v
184 }
185 }
186 return
187 }
188
189 data1Pos, data1Neg := splitBySign(data1)
190 data2Pos, data2Neg := splitBySign(data2)
191
192 const barWidth = 0.3 * vg.Centimeter
193 pos1, err := plotter.NewBarChart(data1Pos, barWidth)
194 if err != nil {
195 log.Panic(err)
196 }
197 pos2, err := plotter.NewBarChart(data2Pos, barWidth)
198 if err != nil {
199 log.Panic(err)
200 }
201 neg1, err := plotter.NewBarChart(data1Neg, barWidth)
202 if err != nil {
203 log.Panic(err)
204 }
205 neg2, err := plotter.NewBarChart(data2Neg, barWidth)
206 if err != nil {
207 log.Panic(err)
208 }
209
210 netDots, err := plotter.NewScatter(net)
211 if err != nil {
212 log.Panic(err)
213 }
214 netDots.Radius = vg.Points(1.25)
215
216 pos2.StackOn(pos1)
217 neg2.StackOn(neg1)
218
219 color1 := color.NRGBA{R: 112, G: 22, B: 0, A: 255}
220 color2 := color.NRGBA{R: 91, G: 194, B: 54, A: 100}
221
222 pos1.Color, neg1.Color = color1, color1
223 pos2.Color, neg2.Color = color2, color2
224
225
226 pos1.Horizontal, pos2.Horizontal, neg1.Horizontal, neg2.Horizontal = true, true, true, true
227
228
229 zero, err := plotter.NewLine(plotter.XYs{{0, 0}, {0, 5}})
230 if err != nil {
231 log.Panic(err)
232 }
233
234 p := plot.New()
235 p.Add(zero, pos1, pos2, neg1, neg2, netDots)
236 p.NominalY("Alpha", "Bravo", "Charlie", "Echo", "Foxtrot", "Golf")
237
238 p.Legend.Add("1", pos1)
239 p.Legend.Add("2", pos2)
240 p.Legend.Add("Sum", netDots)
241 p.Legend.Top = true
242 p.Legend.ThumbnailWidth = 2 * vg.Millimeter
243 p.Legend.TextStyle.Font.Size = 2 * vg.Millimeter
244
245 err = p.Save(100, 100, "testdata/barChart_positiveNegative.png")
246 if err != nil {
247 log.Panic(err)
248 }
249 }
250
View as plain text