use super::{generate_nested_list_3, matrix_to_array, AsMatrix, GraphMaker};
use num_traits::Num;
use std::fmt::Write;
pub struct Image {
colormap_name: String, extra: String, buffer: String, }
impl Image {
pub fn new() -> Self {
Image {
colormap_name: String::new(),
extra: String::new(),
buffer: String::new(),
}
}
pub fn draw<'a, T, U>(&mut self, data: &'a T)
where
T: AsMatrix<'a, U>,
U: 'a + std::fmt::Display + Num,
{
matrix_to_array(&mut self.buffer, "data", data);
let opt = self.options();
write!(&mut self.buffer, "plt.imshow(data{})\n", &opt).unwrap();
}
pub fn draw_rgb_or_rgba<T>(&mut self, data: &Vec<Vec<Vec<T>>>)
where
T: std::fmt::Display + Num,
{
generate_nested_list_3(&mut self.buffer, "data", data);
let opt = self.options();
write!(&mut self.buffer, "plt.imshow(data{})\n", &opt).unwrap();
}
pub fn set_colormap_index(&mut self, index: usize) -> &mut Self {
const CMAP: [&str; 7] = ["bwr", "RdBu", "hsv", "jet", "terrain", "pink", "Greys"];
self.colormap_name = CMAP[index % 7].to_string();
self
}
pub fn set_colormap_name(&mut self, name: &str) -> &mut Self {
self.colormap_name = String::from(name);
self
}
pub fn set_extra(&mut self, extra: &str) -> &mut Self {
self.extra = extra.to_string();
self
}
fn options(&self) -> String {
let mut opt = String::new();
if self.colormap_name != "" {
write!(&mut opt, ",cmap=plt.get_cmap('{}')", self.colormap_name).unwrap();
}
if self.extra != "" {
write!(&mut opt, ",{}", self.extra).unwrap();
}
opt
}
}
impl GraphMaker for Image {
fn get_buffer<'a>(&'a self) -> &'a String {
&self.buffer
}
fn clear_buffer(&mut self) {
self.buffer.clear();
}
}
#[cfg(test)]
mod tests {
use super::Image;
use crate::GraphMaker;
#[test]
fn new_works() {
let img = Image::new();
assert_eq!(img.colormap_name.len(), 0);
assert_eq!(img.extra.len(), 0);
assert_eq!(img.buffer.len(), 0);
}
#[test]
fn draw_works_1() {
let xx = [[1, 2], [3, 2]];
let mut img = Image::new();
img.set_colormap_index(0).set_colormap_name("terrain").draw(&xx);
let b: &str = "data=np.array([[1,2,],[3,2,],])\n\
plt.imshow(data,cmap=plt.get_cmap('terrain'))\n";
assert_eq!(img.buffer, b);
img.clear_buffer();
assert_eq!(img.buffer, "");
}
}