use super::*;
pub struct Curve {
pub line_alpha: f64,
pub line_color: String,
pub line_style: String,
pub line_width: f64,
pub marker_alpha: f64,
pub marker_color: String,
pub marker_every: i32,
pub marker_is_void: bool,
pub marker_line_color: String,
pub marker_line_style: String,
pub marker_line_width: f64,
pub marker_size: f64,
pub marker_style: String,
pub(crate) buffer: String,
}
impl Curve {
pub fn new() -> Self {
Curve {
line_alpha: 0.0,
line_color: String::new(),
line_style: String::new(),
line_width: 0.0,
marker_alpha: 0.0,
marker_color: String::new(),
marker_every: 0,
marker_is_void: false,
marker_line_color: String::new(),
marker_line_style: String::new(),
marker_line_width: 0.0,
marker_size: 0.0,
marker_style: String::new(),
buffer: String::new(),
}
}
pub fn draw(&mut self, x: &[f64], y: &[f64]) {
let (sx, sy) = write_arrays(&mut self.buffer, "x", "y", x, y);
let command = format!("plt.plot({},{}{})\n", sx, sy, self.options());
self.buffer.push_str(&command);
}
pub(crate) fn options(&self) -> String {
let line_color = if self.marker_is_void && self.line_color == "" {
"red"
} else {
&self.line_color
};
let mut options = String::new();
if self.line_alpha > 0.0 {
options.push_str(&format!(",alpha={}", self.line_alpha));
}
if line_color != "" {
options.push_str(&format!(",color='{}'", line_color));
}
if self.line_style != "" {
options.push_str(&format!(",linestyle='{}'", self.line_style));
}
if self.line_width > 0.0 {
options.push_str(&format!(",linewidth={}", self.line_width));
}
if self.marker_alpha > 0.0 {
options.push_str(&format!(",markeralpha={}", self.marker_alpha));
}
if self.marker_color != "" {
options.push_str(&format!(",markerfacecolor='{}'", self.marker_color));
}
if self.marker_every > 0 {
options.push_str(&format!(",markevery={}", self.marker_every));
}
if self.marker_is_void {
options.push_str(",markerfacecolor='none'");
}
if self.marker_line_color != "" {
options.push_str(&format!(",markeredgecolor='{}'", self.marker_line_color));
}
if self.marker_line_style != "" {
options.push_str(&format!(",markerlinestyle='{}'", self.marker_line_style));
}
if self.marker_line_width > 0.0 {
options.push_str(&format!(",markeredgewidth={}", self.marker_line_width));
}
if self.marker_size > 0.0 {
options.push_str(&format!(",markersize={}", self.marker_size));
}
if self.marker_style != "" {
options.push_str(&format!(",marker='{}'", self.marker_style));
}
options
}
}
impl GraphMaker for Curve {
fn get_buffer<'a>(&'a self) -> &'a String {
&self.buffer
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn options_works() {
let mut curve = Curve::new();
curve.line_alpha = 0.7;
curve.line_color = "#b33434".to_string();
curve.line_style = "-".to_string();
curve.line_width = 3.0;
curve.marker_alpha = 0.5;
curve.marker_color = "#4c4deb".to_string();
curve.marker_every = 2;
curve.marker_is_void = false;
curve.marker_line_color = "blue".to_string();
curve.marker_line_style = "--".to_string();
curve.marker_line_width = 1.5;
curve.marker_size = 8.0;
curve.marker_style = "o".to_string();
let options = curve.options();
assert_eq!(
options,
"\
,alpha=0.7\
,color='#b33434'\
,linestyle='-'\
,linewidth=3\
,markeralpha=0.5\
,markerfacecolor='#4c4deb'\
,markevery=2\
,markeredgecolor='blue'\
,markerlinestyle='--'\
,markeredgewidth=1.5\
,markersize=8\
,marker='o'\
"
);
}
#[test]
fn draw_works() {
let x = &[1.0, 2.0, 3.0, 4.0, 5.0];
let y = &[1.0, 4.0, 9.0, 16.0, 25.0];
let mut curve = Curve::new();
curve.draw(x, y);
let correct ="x_0=np.array([1.000000000000000,2.000000000000000,3.000000000000000,4.000000000000000,5.000000000000000,],dtype=float)
y_119=np.array([1.000000000000000,4.000000000000000,9.000000000000000,16.000000000000000,25.000000000000000,],dtype=float)
plt.plot(x_0,y_119)
";
assert_eq!(curve.buffer, correct);
}
}