Skip to content

[BUG] Zero division panic with datetime axis and short span of data #709

@aceArt-GmbH

Description

@aceArt-GmbH

Describe the bug

I was trying to draw a graph of temperature changes via plotters-iced when it crashed with a similar stacktrace to the following:

» RUST_BACKTRACE=1 cargo run
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/repro`

thread 'main' (60058) panicked at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/coord/ranged1d/types/datetime.rs:253:24:
attempt to divide by zero
stack backtrace:
   0: __rustc::rust_begin_unwind
             at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/std/src/panicking.rs:698:5
   1: core::panicking::panic_fmt
             at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/panicking.rs:80:14
   2: core::panicking::panic_const::panic_const_div_by_zero
             at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/panicking.rs:180:17
   3: <plotters::coord::ranged1d::types::datetime::RangedDate<D> as plotters::coord::ranged1d::Ranged>::key_points
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/coord/ranged1d/types/datetime.rs:253:24
   4: <plotters::coord::ranged1d::types::datetime::RangedDateTime<DT> as plotters::coord::ranged1d::Ranged>::key_points
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/coord/ranged1d/types/datetime.rs:701:14
   5: plotters::coord::ranged2d::cartesian::Cartesian2d<X,Y>::draw_mesh
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/coord/ranged2d/cartesian.rs:57:26
   6: plotters::drawing::area::DrawingArea<DB,plotters::coord::ranged2d::cartesian::Cartesian2d<X,Y>>::draw_mesh::{{closure}}
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/drawing/area.rs:202:18
   7: plotters::drawing::area::DrawingArea<DB,CT>::backend_ops
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/drawing/area.rs:282:13
   8: plotters::drawing::area::DrawingArea<DB,plotters::coord::ranged2d::cartesian::Cartesian2d<X,Y>>::draw_mesh
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/drawing/area.rs:200:14
   9: plotters::chart::context::cartesian2d::draw_impl::<impl plotters::chart::context::ChartContext<DB,plotters::coord::ranged2d::cartesian::Cartesian2d<X,Y>>>::draw_mesh_lines
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/chart/context/cartesian2d/draw_impl.rs:36:27
  10: plotters::chart::context::cartesian2d::draw_impl::<impl plotters::chart::context::ChartContext<DB,plotters::coord::ranged2d::cartesian::Cartesian2d<X,Y>>>::draw_mesh
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/chart/context/cartesian2d/draw_impl.rs:341:18
  11: plotters::chart::mesh::MeshStyle<X,Y,DB>::draw
             at /home/tux/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/plotters-0.3.7/src/chart/mesh.rs:467:16
  12: repro::main
             at ./src/main.rs:12:28
  13: core::ops::function::FnOnce::call_once
             at /home/tux/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

https://github.com/plotters-rs/plotters/blob/master/plotters/src/coord/ranged1d/types/datetime.rs#L253
[plotters/src/coord/ranged1d/types/datetime.rs:251:9] &total_weeks = -1
[plotters/src/coord/ranged1d/types/datetime.rs:252:9] &max_points = 110
[plotters/src/coord/ranged1d/types/datetime.rs:255:9] &week_per_point = 0

this issue seems very related to #190.
Seems like the issue @drager and @stephin-thomas are describing with "minute data". Only days and weeks seem supported at the moment? (https://github.com/plotters-rs/plotters/blob/master/plotters/src/coord/ranged1d/types/datetime.rs#L228-L243)
This should be a valid use-case, right? At least it should not crash like this

To Reproduce

Repro without iced:

// cargo add chrono plotters

use chrono::{TimeZone, Utc};
use plotters::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let root = BitMapBackend::new("0.png", (640, 480)).into_drawing_area();

    let newest_time = Utc.with_ymd_and_hms(2025, 12, 29, 0, 0, 0).unwrap();
    let oldest_time = Utc.with_ymd_and_hms(2026, 1, 4, 23, 0, 0).unwrap();

    let mut chart = ChartBuilder::on(&root).build_cartesian_2d(oldest_time..newest_time, 0..10)?;

    chart.configure_mesh().draw()?;
    Ok(())
}

Version Information

chrono = "0.4.42"
plotters = "0.3.7"
rustc 1.92.0 (ded5c06cf 2025-12-08)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions