Charton - 一个多功能的 Rust 绘图库
May 23, 2026 · View on GitHub
Charton - 一个多功能的 Rust 绘图库
Rust 版 Altair 风格声明式绘图。高性能、Polars 友好、且兼容 Wasm。
“非常棒的项目。... 作为一个生态系统运行得非常完美。” — Ritchie Vink, Polars 创始人
意到图成
标准组件 — 无限图表
Charton 是一款高性能 Rust 绘图库,其声明式 API 灵感源自 Altair。它支持 Polars 数据框,并可使用已有的 Python 可视化工具(Altair/Matplotlib)。通过与 evcxr_jupyter 集成,还可以在 Notebook 中实现交互式数据探索。
Altair |
![]() Matplotlib |
Stacked Bar Chart |
Grouped Bar With Errorbar |
Density |
Histogram |
2d Density Chart |
Heatmap |
Grouped Boxplot |
Cumulative Frequency |
Distribution |
Pie |
Donut |
Rose |
Nightingale |
Simple Stack Area |
Normalized Stacked Area |
Steamgraph |
Beeswarm |
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.52 | load_polars_v44_52!(df)? | 旧版支持 |
| < 0.44 | N/A | 不支持 |
分层语法
受图形语法(如 ggplot2 和 Altair)影响,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 在浏览器中实现了实时可视化,模拟传感器定时采集信号强度数据。
交互式作图 (Jupyter)
Charton 与 evcxr_jupyter 集成,支持交互式数据探索。将 .save() 替换为 .show() 即可直接在 jupyter notebook 单元格中显示 SVG:

利用第三方可视化生态
Charton 通过高速 IPC 将 Rust 与成熟的可视化生态(如 Altair 和 Matplotlib)连接起来,使用户能够在统一的工作流中利用多样化、专业级的绘图工具。详情请参考 Charton Docs。
原生图层同步
Charton 基于单一事实来源处理标度映射,能组合不同来源的数据,并保持所有图表元素与坐标轴的逻辑一致性。

该图展示了 Charton 中的语义同步。来自不同数据源的点集与条形图被锚定在统一的标度体系下,确保了数据与色彩、空间位置映射关系的精准对齐。
出版级质量
Charton 作图精准,提供对复杂标记的像素级控制。无论是用于生物医学研究的多层误差线(ErrorBar),还是用于金融领域的高密度散点图,Charton 都能提供顶尖期刊所需的审美严谨性。
![]() NEJM |
Charton |
使用 Charton 复现了 2021 年新英格兰医学杂志上发表的使用减肥药司美格鲁肽进行体重管理的研究论文中的图 1A。
文档
请访问 Charton Docs 查看完整文档。
License
Charton 基于 Apache License 2.0 许可证开源。

