use crate::artist::AxesImage;
use crate::figure::Axes;
impl Axes {
pub fn imshow(&mut self, data: &[f64], nrows: usize, ncols: usize) -> &mut AxesImage {
let image = AxesImage::new(data.to_vec(), nrows, ncols);
self.images.push(image);
self.images.last_mut().expect("just pushed an image")
}
}
#[cfg(test)]
mod tests {
use crate::core::Bbox;
use crate::figure::Axes;
#[test]
fn imshow_sets_data_limits_to_extent() {
let mut ax = Axes::new(Bbox::from_extents(0.0, 0.0, 1.0, 1.0));
ax.imshow(&[0.0, 1.0, 2.0, 3.0, 4.0, 5.0], 2, 3);
let limits = ax.data_limits().expect("image provides data limits");
assert_eq!(limits.xmin(), 0.0);
assert_eq!(limits.xmax(), 3.0);
assert_eq!(limits.ymin(), 0.0);
assert_eq!(limits.ymax(), 2.0);
}
#[test]
fn imshow_handle_tunes_colorization_in_place() {
let mut ax = Axes::new(Bbox::from_extents(0.0, 0.0, 1.0, 1.0));
ax.imshow(&[0.0, 1.0, 2.0, 3.0], 2, 2)
.cmap("gray")
.vmin(0.0)
.vmax(10.0);
assert_eq!(ax.images.len(), 1);
assert_eq!(ax.images[0].clim(), (0.0, 10.0));
}
#[test]
fn set_image_data_replaces_data_and_keeps_the_norm() {
let mut ax = Axes::new(Bbox::from_extents(0.0, 0.0, 1.0, 1.0));
ax.imshow(&[0.0, 1.0, 2.0, 3.0], 2, 2).vmin(0.0).vmax(10.0);
ax.set_image_data(0, &[0.0; 6], 2, 3, Some([5.0, 8.0, 0.0, 2.0]))
.expect("image 0 exists");
assert_eq!(ax.images[0].clim(), (0.0, 10.0));
assert_eq!(ax.images[0].extent(), [5.0, 8.0, 0.0, 2.0]);
let limits = ax.data_limits().expect("image provides data limits");
assert_eq!((limits.xmin(), limits.xmax()), (5.0, 8.0));
assert!(ax.set_image_data(3, &[0.0; 4], 2, 2, None).is_err());
assert!(ax.set_image_data(0, &[0.0; 5], 2, 2, None).is_err());
}
#[test]
fn imshow_explicit_extent_drives_limits() {
let mut ax = Axes::new(Bbox::from_extents(0.0, 0.0, 1.0, 1.0));
ax.imshow(&[0.0; 4], 2, 2).set_extent([-2.0, 6.0, 1.0, 9.0]);
let limits = ax.data_limits().expect("image provides data limits");
assert_eq!((limits.xmin(), limits.xmax()), (-2.0, 6.0));
assert_eq!((limits.ymin(), limits.ymax()), (1.0, 9.0));
}
}