首页 > 解决方案 > 使用 rust 为第三列值绘制带有颜色的 2D 地图

问题描述

我有一个矢量Vec<(i32,i32,i32)>,想创建一个 2D 彩虹或渐变图。向量的第三个元素是颜色的值。我正在使用绘图仪库图像示例中的颜色图。任何想法或代码示例?

预期结果

我实现了下面的代码,得到的结果非常接近我想要的。我不知道如何解决包含颜色条、作为颜色参考以及如何平滑字段的问题。

    fn figura2(profun: Vec<(i32, i32, i32)>) -> Result<(), Box<dyn std::error::Error>> {
    let root = BitMapBackend::new("plot_fold.png", (800, 600)).into_drawing_area();
    root.fill(&WHITE)?;

    let mut scatter_ctx = ChartBuilder::on(&root)
        .top_x_label_area_size(40)
        .y_label_area_size(55)
        .build_cartesian_2d((1581001..1581542).step(1), 5500i32..0i32)?;
    scatter_ctx
        .configure_mesh()
        .disable_x_mesh()
        .disable_y_mesh()
        .y_desc("OFFSET (m)")
        .x_desc("ESTACAS (RP)")
        .axis_desc_style(("sans-serif", 15))
        .draw()?;
    scatter_ctx.draw_series(profun.iter().map(|(x, y, v)| {
        Rectangle::new(
            [(*x, *y), (x + 1, y - 500)],
            HSLColor(
                240.0 / 360.0 - 240.0 / 360.0 * (*v as f64 / 150.0),
                0.7,
                0.1 + 0.4 * *v as f64 / 200.0,
            )
            .filled(),
        )
    }))?;

    Ok(())
}

上述代码的结果

标签: rustrust-cargo

解决方案


我在 Y 轴上得到了更平滑的结果,将交互范围从 500 减少到 100。并且使用colorous 库进行了更好的颜色匹配。

结果

代码发生了什么变化。

scatter_ctx.draw_series(profun.iter().map(|(x, y, v)| {
        Rectangle::new(
            [(*x, *y), (x + 1, y - 100)],
            {
                let cor = gradient.eval_rational(*v as usize, nfold as usize);
                RGBColor(
                    cor.r,
                    cor.g,
                    cor.b,
                )
                .filled()
            },
        )
    }))?;

颜色条作为分配给字段中每种颜色的值的参考的问题仍有待解决。


推荐阅读