diff --git a/charming/src/datatype/dataframe.rs b/charming/src/datatype/dataframe.rs index 640f2e4..52ecac3 100644 --- a/charming/src/datatype/dataframe.rs +++ b/charming/src/datatype/dataframe.rs @@ -69,3 +69,69 @@ macro_rules! df { ] }; } + +/// Code below is modified from ChatGPT generated code. +/// The main objective of macro dz! is to transpose mixed data type vectors, +/// aka columns or dimensions into ECharts dataframe format. + +#[macro_export] +macro_rules! dz { + /* + Handle named vectors + let d1 = vec![44056, 13334]; + let d2 = vec![81.8, 76.9]; + let d3 = vec![23968973, 1376048943]; + let d4 = vec!["Australia", "China"]; + let d5 = vec![2015, 2015]; + let df = dz!(d1, d2, d3, d4, d5); + >>df = [Value(Array([Number(Integer(44056)), Number(Float(81.8)), + Number(Integer(23968973)), String("Australia"), Number(Integer(2015))])), + Value(Array([Number(Integer(13334)), Number(Float(76.9)), + Number(Integer(1376048943)), String("China"), Number(Integer(2015))]))] + */ + ($($v:expr),* $(,)?) => {{ + let mut df = Vec::new(); + let mut iterators: Vec>> = vec![ + $(Box::new($v.into_iter().map(|x| $crate::datatype::CompositeValue::from(x))),)* + ]; + + let len = iterators.first().map(|v| v.size_hint().0).unwrap_or(0); + + for _ in 0..len { + let mut row = Vec::new(); + for iter in iterators.iter_mut() { + if let Some(value) = iter.next() { + row.push(value); + } + } + let z = $crate::datatype::DataPoint::from(row); + df.push(z); + } + df + }}; + + /* + Handle direct input of vectors + let df = dz!([44056, 13334], [81.8, 76.9], [23968973, 1376048943], ["Australia", "China"], [2015, 2015]); + >>df = [Value(Array([Number(Integer(44056)), Number(Float(81.8)), + Number(Integer(23968973)), String("Australia"), Number(Integer(2015))])), + Value(Array([Number(Integer(13334)), Number(Float(76.9)), + Number(Integer(1376048943)), String("China"), Number(Integer(2015))]))] + */ + ($([$($v:expr),*]),* $(,)?) => {{ + let mut df = Vec::new(); + let mut iterators: Vec<_> = vec![$(vec![$($v.into()),*].into_iter()),*]; + + let len = iterators.first().map(|v| v.len()).unwrap_or(0); + for _ in 0..len { + let mut row = Vec::new(); + for iter in &mut iterators { + if let Some($crate::datatype::CompositeValue) = iter.next() { + row.push($crate::datatype::CompositeValue); + } + } + df.push(row); + } + df + }}; +} diff --git a/charming/src/series/scatter.rs b/charming/src/series/scatter.rs index e7eb193..f3e43f4 100644 --- a/charming/src/series/scatter.rs +++ b/charming/src/series/scatter.rs @@ -3,7 +3,7 @@ use serde::Serialize; use crate::{ datatype::{DataFrame, DataPoint}, element::{ - ColorBy, CoordinateSystem, DimensionEncode, Emphasis, ItemStyle, MarkArea, MarkLine, + ColorBy, CoordinateSystem, DimensionEncode, Emphasis, ItemStyle, Label, MarkArea, MarkLine, Symbol, SymbolSize, }, }; @@ -19,10 +19,13 @@ pub struct Scatter { #[serde(skip_serializing_if = "Option::is_none")] name: Option, - + #[serde(skip_serializing_if = "Option::is_none")] color_by: Option, + #[serde(skip_serializing_if = "Option::is_none")] + label: Option