use std::env::args;
extern crate cairo;
extern crate gio;
extern crate gtk;
#[allow(unused_imports)]
use self::gio::prelude::*;
use self::gtk::prelude::*;
use self::gtk::DrawingArea;
use self::cairo::Context;
use self::cairo::enums::{FontSlant, FontWeight};
#[allow(unused_imports)]
use self::cairo::MatrixTrait;
mod chart_prop;
pub use self::chart_prop::ChartProp;
mod axis_prop;
pub use self::axis_prop::AxisProp;
mod chart;
pub use self::chart::Chart;
mod window;
mod axis_drawer;
mod charts;
pub use self::charts::histogram::Histogram;
pub use self::charts::box_whisker_plot::BoxWhiskerPlot;
pub use self::charts::doughnut_chart::DoughnutChart;
pub use self::charts::pie_chart::PieChart;
pub use self::charts::vertical_bar_chart::VerticalBarChart;
pub use self::charts::radar_chart::RadarChart;
pub use self::charts::area_chart::AreaChart;
pub use self::charts::stacked_area_chart::StackedAreaChart;
pub use self::charts::line_chart::LineChart;
pub use self::charts::xy_scatter_plot::XYScatterPlot;
pub use self::charts::bubble_chart::BubbleChart;
pub(in chart_builder) fn get_percentage_in_bounds(value: f64, min: f64, max: f64) -> f64 {
(value - min) / (max - min)
}
pub fn remove_outliers(data: &Vec<f64>) -> Vec<f64> {
let mut sorted_data = data.clone();
sorted_data.sort_unstable_by(|a, b| a.partial_cmp(b).unwrap());
use chart_builder::axis_prop::percentile;
let lq = percentile(&sorted_data, 0.25);
let uq = percentile(&sorted_data, 0.75);
let iqr = uq - lq;
let lower_limit = lq - iqr * 1.5;
let upper_limit = uq + iqr * 1.5;
sorted_data.retain(|&i|i >= lower_limit && i <= upper_limit);
sorted_data
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_percentage_in_bounds_tests() {
assert_eq!(get_percentage_in_bounds(0.0, 0.0, 10.0), 0.0);
assert_eq!(get_percentage_in_bounds(10.0, 0.0, 10.0), 1.0);
assert_eq!(get_percentage_in_bounds(5.0, 0.0, 10.0), 0.5);
assert_eq!(get_percentage_in_bounds(2.0, 0.0, 10.0), 0.2);
assert_eq!(get_percentage_in_bounds(7.0, 0.0, 10.0), 0.7);
assert_eq!(get_percentage_in_bounds(-2.0, 0.0, 10.0), -0.2);
assert_eq!(get_percentage_in_bounds(12.0, 0.0, 10.0), 1.2);
}
#[test]
fn remove_outliers_tests() {
let vec_1: Vec<f64> = vec![1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0];
let result_1 = vec![1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0];
let outlier_res_1 = remove_outliers(&vec_1);
assert_eq!(outlier_res_1, result_1);
let vec_2: Vec<f64> = vec![1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,40.0];
let result_2 = vec![1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0];
let outlier_res_2 = remove_outliers(&vec_2);
assert_eq!(outlier_res_2, result_2);
let vec_3: Vec<f64> = vec![1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,-40.0];
let result_3= vec![1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0];
let outlier_res_3 = remove_outliers(&vec_3);
assert_eq!(outlier_res_3, result_3);
}
}