plot/
lib.rs

1extern crate plotlib;
2
3use std::io::{self, BufRead};
4
5pub struct HistogramConfig {
6    pub nbins: u32,
7}
8
9/// Get a single column of data from stdin
10///
11/// For each line in the input, it tries to convert it to an `f64`.
12fn get_single_column() -> Vec<f64> {
13    let stdin = io::stdin();
14    let mut data: Vec<f64> = vec![];
15    for line in stdin.lock().lines() {
16        let line_text = match line {
17            Ok(line) => line,
18            Err(err) => panic!("IO error: {}", err),
19        };
20        data.push(line_text.parse::<f64>()
21            .expect(&format!("ERROR: Could not parse '{}' as an f64", line_text)));
22    }
23    data
24}
25
26fn get_two_columns() -> Vec<(f64, f64)> {
27    let stdin = io::stdin();
28    let mut data: Vec<(f64, f64)> = vec![];
29    for line in stdin.lock().lines() {
30        let line_text = match line {
31            Ok(line) => line,
32            Err(err) => panic!("IO error: {}", err),
33        };
34        let nums: Vec<_> = line_text.split_whitespace().collect();
35        if nums.len() != 2 {
36            panic!("Wrong number of args on line");
37        }
38        let a = nums[0];
39        let b = nums[1];
40
41        let a = a.parse::<f64>()
42            .expect(&format!("ERROR: Could not parse '{}' as an f64", a));
43        let b = b.parse::<f64>()
44            .expect(&format!("ERROR: Could not parse '{}' as an f64", b));
45
46        data.push((a, b));
47    }
48    data
49}
50
51pub fn hist(config: HistogramConfig) {
52    let data = get_single_column();
53
54    let h = plotlib::histogram::Histogram::from_vec(&data, config.nbins);
55
56    plotlib::text_render::draw_histogram(&h);
57}
58
59pub fn scatter() {
60    let data = get_two_columns();
61
62    let h = plotlib::scatter::Scatter::from_vec(&data);
63
64    plotlib::text_render::draw_scatter(&h);
65}
66
67pub fn average() {
68    let stdin = io::stdin();
69    let mut total = 0.0;
70    let mut length = 0;
71    for line in stdin.lock().lines() {
72        let line_text = match line {
73            Ok(line) => line,
74            Err(err) => panic!("IO error: {}", err),
75        };
76        length += 1;
77        total += line_text.parse::<f64>()
78            .expect(&format!("ERROR: Could not parse '{}' as an f64", line_text));
79    }
80
81    println!("{}", total / length as f64);
82}
83
84pub fn stats() {
85    let data = get_single_column();
86
87    let max = data.iter().fold(-1. / 0., |a, &b| f64::max(a, b));
88    let min = data.iter().fold(1. / 0., |a, &b| f64::min(a, b));
89    let total: f64 = data.iter().sum();
90    let average = total / data.len() as f64;
91    let length = data.len();
92
93    println!("    Max: {}", max);
94    println!("    Min: {}", min);
95    println!("Average: {}", average);
96    println!(" Length: {}", length);
97}