See http://dygraphs.com/data.html
()
| 267 | |
| 268 | // See http://dygraphs.com/data.html |
| 269 | func (p *Plot) data() (dataPoints, []string, error) { |
| 270 | var ( |
| 271 | series []*timeSeries |
| 272 | count int |
| 273 | ) |
| 274 | |
| 275 | for _, as := range p.series { |
| 276 | for _, s := range as.series { |
| 277 | if s != nil { |
| 278 | series = append(series, s) |
| 279 | count += s.len |
| 280 | } |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | var ( |
| 285 | size = 1 + len(series) |
| 286 | nan = math.NaN() |
| 287 | labels = make([]string, size) |
| 288 | data = make(dataPoints, 0, count) |
| 289 | ) |
| 290 | |
| 291 | labels[0] = "Seconds" |
| 292 | |
| 293 | sort.Slice(series, func(i, j int) bool { |
| 294 | return series[i].attack+series[i].label < |
| 295 | series[j].attack+series[j].label |
| 296 | }) |
| 297 | |
| 298 | for i, s := range series { |
| 299 | points, err := lttb.Downsample(s.len, p.threshold, s.iter()) |
| 300 | if err != nil { |
| 301 | return nil, nil, err |
| 302 | } |
| 303 | |
| 304 | for _, p := range points { |
| 305 | pt := make([]float64, size) |
| 306 | for j := range pt { |
| 307 | pt[j] = nan |
| 308 | } |
| 309 | pt[0], pt[i+1] = p.X, p.Y |
| 310 | data = append(data, pt) |
| 311 | } |
| 312 | |
| 313 | labels[i+1] = s.attack + ": " + s.label |
| 314 | } |
| 315 | |
| 316 | sort.Stable(data) |
| 317 | |
| 318 | return data, labels, nil |
| 319 | } |
| 320 | |
| 321 | func asset(path string) ([]byte, error) { |
| 322 | file, err := Assets.Open(path) |
no test coverage detected