theta_chart/series/
series_label.rs

1use crate::{
2    chart::*,
3    coord::{Axes, Stick},
4};
5
6#[derive(Debug, Clone, Default)]
7/// A series of labels represented on a chart
8pub struct SLabel {
9    labels: Vec<String>,
10}
11
12impl SLabel {
13    pub fn new(labels: Vec<String>) -> Self {
14        Self { labels }
15    }
16
17    pub fn labels(&self) -> Vec<String> {
18        self.labels.clone()
19    }
20
21    pub fn merge(&self, other: SLabel) -> Self {
22        let v1 = self.labels();
23        let v2 = other.labels();
24        let labels = merge_vec_string(v1, v2);
25
26        Self { labels }
27    }
28}
29
30impl From<Vec<String>> for SLabel {
31    fn from(labes: Vec<String>) -> Self {
32        Self {
33            labels: labes.clone(),
34        }
35    }
36}
37
38impl From<Vec<&str>> for SLabel {
39    fn from(labes: Vec<&str>) -> Self {
40        let vec_string: Vec<String> = labes.iter().map(|&s| s.into()).collect();
41        Self { labels: vec_string }
42    }
43}
44
45impl ScaleLabel for SLabel {
46    fn scale(&self, value: f64) -> f64 {
47        let (min, max) = (0., self.labels.len() as f64);
48        let range = max - min;
49
50        let diff = value - min;
51        diff / range
52    }
53
54    fn scale_index(&self, s: String) -> usize {
55        let labels = self.labels();
56        get_index(&labels, s)
57    }
58
59    fn gen_axes(&self) -> Axes {
60        let style = "label".to_string();
61        let distance = self.labels.len();
62        let series = &self.labels;
63        let mut vec_stick: Vec<Stick> = vec![];
64        // For stick < 0
65        for index in 0..(distance) {
66            let stick = Stick::new(format!("{}", series[index]), self.scale(index as f64 + 0.5));
67            vec_stick.push(stick);
68        }
69
70        Axes {
71            sticks: vec_stick,
72            step: 1.,
73            style,
74        }
75    }
76    fn to_stick(&self) -> Vec<Stick> {
77        let mut vec_stick: Vec<Stick> = vec![];
78        let len = self.labels().len();
79        for index in 0..len {
80            let stick = Stick::new(format!("{}", self.labels()[index]), index as f64);
81            vec_stick.push(stick);
82        }
83        vec_stick
84    }
85}
86
87fn merge_vec_string(v1: Vec<String>, v2: Vec<String>) -> Vec<String> {
88    let dup = get_dup(v1.clone(), v2.clone());
89    let mut result: Vec<String> = vec![];
90
91    if dup.len() == 0 {
92        result.extend(v1);
93        result.extend(v2);
94    } else {
95        let s = dup[0].clone();
96        let dup_index_v1 = get_index(&v1, s.clone());
97        let dup_index_v2 = get_index(&v2, s.clone());
98        let mut left_v1 = v1.clone();
99        let mut left_v2 = v2.clone();
100        let mut right_v1 = v1.clone();
101        let mut right_v2 = v2.clone();
102
103        left_v1.truncate(dup_index_v1);
104        left_v2.truncate(dup_index_v2);
105        let mut left = merge_vec_string(left_v1, left_v2);
106        left.push(s);
107
108        right_v1 = right_v1.split_off(dup_index_v1 + 1);
109        right_v2 = right_v2.split_off(dup_index_v2 + 1);
110
111        let right = merge_vec_string(right_v1, right_v2);
112
113        result = merge_vec_string(left, right)
114    }
115    result
116}
117
118fn get_dup(v1: Vec<String>, v2: Vec<String>) -> Vec<String> {
119    let mut result: Vec<String> = vec![];
120    for inv2 in v2 {
121        if v1.contains(&inv2) {
122            result.push(inv2)
123        }
124    }
125    result
126}
127
128fn get_index(vec: &Vec<String>, s: String) -> usize {
129    let index = vec.iter().position(|r| r == &s).unwrap();
130    index
131}