use plotters::prelude::*;
use plotters_wxdragon::WxBackend;
use wxdragon::{self as wx, WindowEvents, WxWidget};
struct DrawingPanel {
panel: wx::Panel,
}
impl DrawingPanel {
fn new(parent: &wx::Frame) -> Self {
let panel = wx::PanelBuilder::new(parent).build();
panel.set_background_style(wx::BackgroundStyle::Paint);
panel.on_paint(move |_event| {
let dc = wx::AutoBufferedPaintDC::new(&panel);
let backend = WxBackend::new(&dc).into_drawing_area();
let mut chart = ChartBuilder::on(&backend)
.caption("y=x^2", ("sans-serif", 50).into_font())
.margin(5)
.x_label_area_size(30)
.y_label_area_size(30)
.build_cartesian_2d(-1f32..1f32, -0.1f32..1f32)
.expect("plot grid");
chart.configure_mesh().draw().expect("plot draw");
chart
.draw_series(LineSeries::new(
(-50..=50).map(|x| x as f32 / 50.0).map(|x| (x, x * x)),
&RED,
))
.expect("draw series")
.label("y = x^2")
.legend(|(x, y)| {
PathElement::new(vec![(x, y), (x + 20, y)], RED)
});
chart
.configure_series_labels()
.background_style(WHITE.mix(0.8))
.border_style(BLACK)
.draw()
.expect("configure labels");
backend.present().expect("present");
});
panel.on_size(move |_event| {
panel.refresh(true, None);
});
Self { panel }
}
}
impl std::ops::Deref for DrawingPanel {
type Target = wx::Panel;
fn deref(&self) -> &Self::Target {
&self.panel
}
}
fn main() {
let _ = wxdragon::main(|_| {
let frame = wx::Frame::builder()
.with_title("Plotters example y=x^2")
.with_size(wx::Size::new(800, 600))
.with_position(wx::Point::new(100, 100))
.build();
let drawing_panel = DrawingPanel::new(&frame);
drawing_panel.refresh(true, None);
frame.show(true);
});
}