-
Notifications
You must be signed in to change notification settings - Fork 301
Open
Labels
Description
What is the feature?
Make plotters::series::Histogram
can handle multiple data sets like in matplotlib (examples)
Why this feature is useful and how people would use the feature?
This could help plotting histogram with multiple data sets much easier instead of plotting each rectangle by yourself like this code
pub fn draw_2hist(
datas: [Vec<f64>; 2],
title: &str,
axes_desc: (&str, &str),
path: String,
) -> Result<(), Box<dyn Error>> {
let n = datas.iter().fold(0f64, |max, l| max.max(l.len() as f64));
let max_y = datas.iter().fold(0f64, |max, l| {
max.max(l.iter().fold(f64::NAN, |v_max, &v| v.max(v_max)))
});
let root = BitMapBackend::new(&path, (1024, 768)).into_drawing_area();
root.fill(&WHITE)?;
let mut chart = ChartBuilder::on(&root)
.caption(title, ("Hack", 44, FontStyle::Bold).into_font())
.margin(20)
.x_label_area_size(50)
.y_label_area_size(60)
.build_cartesian_2d((1..n as u32).into_segmented(), 0.0..max_y)?
.set_secondary_coord(0.0..n, 0.0..max_y);
chart
.configure_mesh()
.disable_x_mesh()
.y_desc(axes_desc.1)
.x_desc(axes_desc.0)
.axis_desc_style(("Hack", 20))
.draw()?;
// creating histograms
let a = datas[0].iter().zip(0..).map(|(y, x)| {
Rectangle::new(
[(x as f64 + 0.1, *y), (x as f64 + 0.5, 0f64)],
Into::<ShapeStyle>::into(&RED).filled(),
)
});
// creating histograms
let b = datas[1].iter().zip(0..).map(|(y, x)| {
Rectangle::new(
[(x as f64 + 0.5, *y), (x as f64 + 0.9, 0f64)],
Into::<ShapeStyle>::into(&BLUE).filled(),
)
});
chart.draw_secondary_series(a)?;
chart.draw_secondary_series(b)?;
chart
.configure_series_labels()
.position(SeriesLabelPosition::UpperRight)
.label_font(("Hack", 14).into_font())
.background_style(&WHITE)
.border_style(&BLACK)
.draw()?;
root.present()?;
Ok(())
}
This might also be the same thing #224 talking about too.
marvk, ppputtyo, werner291 and hoel-bagard-hy