三浦ノート

自分の経験したことを検索可能にしていくブログ.誰かの役に立ってくれれば嬉しいです.

Rustのplottersクレートのメモ

(随時更新)

公式サンプルコードが豊富なので嬉しい

github.com

対数目盛

公式サンプルコード

plotters/two-scales.rs at 5612152a3ffe1e2273a4fc6291993927d41eeea6 · plotters-rs/plotters · GitHub

ポイントは14行目にある.log_scale()

        .build_cartesian_2d(0f32..10f32, (0.1f32..1e10f32).log_scale())?

冗長になるのですが一応別の方法として、IntoLogRange::log_scaleにレンジを渡すことでも対数目盛が得られます。

使用例

以下は y = exp(x) のグラフを表示します。

[dependencies]
plotters = "0.3.3"
use plotters::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let root = BitMapBackend::new("0.png", (640, 480)).into_drawing_area();
    root.fill(&WHITE)?;
    let mut chart = ChartBuilder::on(&root)
        .caption("y=exp(x)", ("sans-serif", 50).into_font())
        .margin(50)
        .x_label_area_size(30)
        .y_label_area_size(30)
        .build_cartesian_2d(0..20, IntoLogRange::log_scale(1f64..10e8))?; // y軸を対数目盛にする。

    chart.configure_mesh().draw()?;

    chart.draw_series(LineSeries::new(
        (0..=20).map(|x| (x, (x as f64).exp())),
        &RED,
    ))?
        .label("y = exp(x)")
        .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()?;

    root.present()?;

    Ok(())
}

参考

plotters 0.3.3 - Docs.rs

ChartBuilder in plotters::prelude - Rust

AsRangedCoord in plotters::coord::ranged1d - Rust

IntoLogRange in plotters::prelude - Rust

ヒストグラム

整数値のヒストグラム

公式サンプルコード

plotters/histogram.rs at 1dc3cd5438e45c9b4ef7fc350feaa99a69de5c5f · plotters-rs/plotters · GitHub

ポイントは13行目の

        .build_cartesian_2d((0u32..10u32).into_segmented(), 0u32..10u32)?;

29~31行目の

        Histogram::vertical(&chart)
            .style(RED.mix(0.5).filled())
            .data(data.iter().map(|x: &u32| (*x, 1))),

少数値のヒストグラム

公式サンプルコード

plotters/normal-dist2.rs at 1dc3cd5438e45c9b4ef7fc350feaa99a69de5c5f · plotters-rs/plotters · GitHub

ポイントは31~34行目の

        .set_secondary_coord(
            (-4f64..4f64).step(0.1).use_round().into_segmented(),
            0u32..500u32,
        );

個人的に嵌まったのは、ステップを増やしたりして表示するバーが増えると、バーがどんどん細くなっていって次第に見えなくなってしまうことがありました。

回避には46~49行目にある

    let actual = Histogram::vertical(chart.borrow_secondary())
        .style(GREEN.filled())
        .margin(3)
        .data(random_points.iter().map(|x| (*x, 1)));

.margin(3)の値を小さくすればOK。バー間の空白を設定できます。