theta_chart/series/
series_label.rs1use crate::{
2 chart::*,
3 coord::{Axes, Stick},
4};
5
6#[derive(Debug, Clone, Default)]
7pub 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 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}