1 个不稳定版本

0.7.0 2023年4月23日

#137 in 可视化

Apache-2.0

1.5MB
14K SLoC

为Rust的Vega-Lite V5

license version Release Doc

Actions Status codecov Dependabot Status

一个用于构建图表的Rust API的Vega-Lite V4。

与Python中的Altair项目类似,该项目基于Vega-Lite规范。Vega-Lite是一种交互式图形的高级语法。它提供了一种简洁的JSON语法,可以快速生成可视化以支持分析。Vega-Lite规范可以编译为Vega规范。然后,这些规范由Vega的JavaScript运行时解析,以生成静态图像或基于Web的交互式视图。该库具有Vega-Lite 3.4规范的完整映射,可以在src/schema.rs中找到。通过所有类型和结构,可以创建将序列化为Vega-Lite JSON的Rust Vegalite图。感谢Showata,生成的可视化可以在Web浏览器或Rust Jupyter Notebook中显示。还可以使用现有的Vega-Lite JSON并将其数据源无缝连接。这样,您可以利用现有的可视化并将其适应到设计中。

示例

为了有Vega-Lite V4规范的完整映射,代码是自动生成的。为了描述所有可能的功能,在GitHub上提供了一个示例画廊

启动所有示例

cargo install cargo-make
cargo make run-all-examples

使用ndarray生成的数据的简单图表

let values: Array2<f64> = Array::random((100, 2), StandardNormal);

let chart = VegaliteBuilder::default()
    .title("Random points")
    .data(values)
    .mark(Mark::Point)
    .encoding(
        EncodingBuilder::default()
            .x(XClassBuilder::default()
                .field("data.0")
                .def_type(StandardType::Quantitative)
                .build()?)
            .y(YClassBuilder::default()
                .field("data.1")
                .def_type(StandardType::Quantitative)
                .build()?)
            .build()?,
    )
    .build()?;
chart.show()?;

使用现有json定义和新的数据的简单图表

// Use existing vega-lite json specification
let spec = r##"{
    "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
    "encoding": {
        "x": {
            "field": "data.0",
            "type": "quantitative"
        },
        "y": {
            "field": "data.1",
            "type": "quantitative"
        }
    },
    "mark": "point",
    "title": "Random points"
}"##;

// Use you own data to populate the chart
let values: Array2<f64> = Array::random((100, 2), StandardNormal);
let mut chart: Vegalite = serde_json::from_str(spec)?;
chart.data = values.into();

// display the chart using `showata`
chart.show()?;

功能

名称 默认启用 功能 相关库
show_vega 可以在浏览器或笔记本中显示图表 showata
csv 可以从csv加载数据 csv
ndarray 可以从ndarray加载数据 ndarray
nalgebra 可以从nalgebra::Matrix加载数据 nalgebra
rulinalg 可以从rulinalg::matrix::Matrix加载数据 rulinalg
polars 可以从polars::prelude::DataFrame加载数据 polars

故障排除

堆栈大小

由于 vegalite JSON 架构很大,有许多替代方案,所以类型化的 Rust 版本创建了大量结构体和枚举(宏展开前的生成源文件有 28K 行)。因此,模型在堆栈中的大小可能很大(这也是为什么在结构体中使用 Box 的原因)。

在 wasm32 上,使用默认的堆栈大小(约 1 MB)时,使用 vegalite_5 可能会引发错误

  • 崩溃标签页中带有 SIGSEGV(基于铬的浏览器)
  • 未捕获的 ( promise) RuntimeError: 内存访问越界 或简单地说 未捕获的 ( promise) RuntimeError

当前的解决方案是增加堆栈大小(例如 ~ 1.5 MB)。对于基于 cargo 的项目,您可以将以下内容添加到项目的 .cargo/config 文件中

[target.wasm32-unknown-unknown]
rustflags = [
  "-C", "link-args=-z stack-size=1500000",
]

依赖关系

~4–16MB
~207K SLoC