Charton - 一个多功能的 Rust 绘图库

May 23, 2026 · View on GitHub

English | 简体中文

Charton - 一个多功能的 Rust 绘图库

Rust 版 Altair 风格声明式绘图。高性能、Polars 友好、且兼容 Wasm。

“非常棒的项目。... 作为一个生态系统运行得非常完美。”Ritchie Vink, Polars 创始人

Crates.io Documentation Build Status License

意到图成
标准组件 — 无限图表

Charton 是一款高性能 Rust 绘图库,其声明式 API 灵感源自 Altair。它支持 Polars 数据框,并可使用已有的 Python 可视化工具(Altair/Matplotlib)。通过与 evcxr_jupyter 集成,还可以在 Notebook 中实现交互式数据探索。

Altair

Altair

Matplotlib

Matplotlib

Stacked Bar Chart

Stacked Bar Chart

Grouped Bar Chart with Errorbar

Grouped Bar With Errorbar

Density

Density

Histogram

Histogram

2d Density

2d Density Chart

Heatmap

Heatmap

Grouped Boxplot

Grouped Boxplot

Cumulative Frequency

Cumulative Frequency

Distribution

Distribution

Pie

Pie

Donut

Donut

Rose

Rose

Nightingale

Nightingale

Simple Stacked Area

Simple Stack Area

Normalized Stacked Area

Normalized Stacked Area

Steamgraph

Steamgraph

Beeswarm

Beeswarm

Strip

Strip

安装

Cargo.toml 中添加:

[dependencies]
charton = "0.5"                                         # 标准版 (单线程)
charton = { version = "0.5", features = ["parallel"] }  # 多线程加速
charton = { version = "0.5", features = ["png"] }       # 支持导出 PNG
charton = { version = "0.5", features = ["pdf"] }       # 支持导出 PDF
charton = { version = "0.5", features = ["bridge"] }    # 支持 Altair/Matplotlib 互操作

快速上手

Charton 提供了高级声明式 API。通过一行代码就可以实现可视化:

use charton::prelude::*;

// 数据:身体指标(身高 vs. 体重)
let height = vec![160.0, 165.0, 170.0, 175.0, 180.0];
let weight = vec![55.0, 62.0, 68.0, 75.0, 82.0];

// 一行代码绘图
chart!(height, weight)?.mark_point()?.encode((alt::x("height"), alt::y("weight")))?.save("out.svg")?;

从宏到生产级 API

虽然 chart! 宏在快速原型设计和书写简单脚本时非常方便,但在需要显式处理数据的生产环境中,建议使用底层的 Chart::build API。

1. 专业构建 API

对于复杂的应用程序,使用 Chart::build 可以完全控制 Dataset 的生命周期。

let ds = Dataset::new()
    .with_column("height", height)?
    .with_column("weight", weight)?;

Chart::build(ds)? // 等价于 chart!(ds)?
    .mark_point()?
    .encode((alt::x("height"), alt::y("weight")))?
    .save("out.svg")?;

提示:如果需要在循环或条件逻辑中动态添加列,请使用 add_column

2. Polars 集成

针对 Polars 用户,Charton 提供了 load_polars_df! 宏,可将 DataFrame 转换为 Charton 内部专用的 Dataset

use polars::prelude::*;

let df = df![
    "height" => vec![160.0, 165.0, 170.0, 175.0, 180.0],
    "weight" => vec![55.0, 62.0, 68.0, 75.0, 82.0]
]?;

// 将 Polars DataFrame 转换为 Charton Dataset
let ds = load_polars_df!(df)?;

Chart::build(ds)? // 等价于 chart!(ds)?
    .mark_point()?
    .encode((alt::x("height"), alt::y("weight")))?
    .save("out.svg")?;

兼容性说明: 由于 Polars API 变化频繁,Charton 使用带版本标记的宏来处理兼容性。不再支持 0.44 以下的版本。

Polars 版本使用的宏状态
0.53+load_polars_df!(df)?最新(标准)
0.44 - 0.52load_polars_v44_52!(df)?旧版支持
< 0.44N/A不支持

分层语法

受图形语法(如 ggplot2Altair)影响,Charton 用模块化的图层系统取代了固定模板。通过组合原子标记(Marks)能构建出丰富的图表类型,极大的提高了作图灵活性。

// 创建独立图层
let line = chart!(height, weight)?
    .mark_line()?
    .encode((alt::x("height"), alt::y("weight")))?;

let point = chart!(height, weight)?
    .mark_point()?
    .encode((alt::x("height"), alt::y("weight")))?;

// 组合成复合图表
line.and(point).save("layered.svg")?;

WebAssembly 与前端

Charton 支持 WebAssembly 及现代 Web 前端开发。下面这个示例,基于 Charton 和 WebAssembly 在浏览器中实现了实时可视化,模拟传感器定时采集信号强度数据。

Charton Wasm demo

交互式作图 (Jupyter)

Charton 与 evcxr_jupyter 集成,支持交互式数据探索。将 .save() 替换为 .show() 即可直接在 jupyter notebook 单元格中显示 SVG:

evcxr jupyter

利用第三方可视化生态

Charton 通过高速 IPC 将 Rust 与成熟的可视化生态(如 AltairMatplotlib)连接起来,使用户能够在统一的工作流中利用多样化、专业级的绘图工具。详情请参考 Charton Docs

原生图层同步

Charton 基于单一事实来源处理标度映射,能组合不同来源的数据,并保持所有图表元素与坐标轴的逻辑一致性。

Comparison

该图展示了 Charton 中的语义同步。来自不同数据源的点集与条形图被锚定在统一的标度体系下,确保了数据与色彩、空间位置映射关系的精准对齐。

出版级质量

Charton 作图精准,提供对复杂标记的像素级控制。无论是用于生物医学研究的多层误差线(ErrorBar),还是用于金融领域的高密度散点图,Charton 都能提供顶尖期刊所需的审美严谨性。

NEJM

NEJM

Charton

Charton

使用 Charton 复现了 2021 年新英格兰医学杂志上发表的使用减肥药司美格鲁肽进行体重管理的研究论文中的图 1A。

文档

请访问 Charton Docs 查看完整文档。

License

Charton 基于 Apache License 2.0 许可证开源。