Rust可视化工具库plotly_kaleido的使用,plotly_kaleido提供静态图表导出与高质量渲染功能
plotly_kaleido
这是一个内部crate,为Plotly.rs实现了kaleido
功能。kaleido
功能使Plot
能够转换为以下输出格式:png
、jpeg
、webp
、svg
、pdf
和eps
。
安装
在项目目录中运行以下Cargo命令:
cargo add plotly_kaleido
或者在Cargo.toml中添加以下行:
plotly_kaleido = "0.13.4"
使用示例
下面是一个完整的示例,展示如何使用plotly_kaleido导出图表:
use plotly::{Plot, Scatter};
use plotly_kaleido::Kaleido;
fn main() {
// 创建一个简单的折线图
let trace = Scatter::new(vec![1, 2, 3], vec![4, 5, 6]);
let mut plot = Plot::new();
plot.add_trace(trace);
// 初始化Kaleido导出器
let kaleido = Kaleido::new();
// 将图表导出为PNG文件
if let Err(e) = kaleido.save(&plot, "output.png", plotly_kaleido::ImageFormat::PNG) {
eprintln!("导出图表失败: {}", e);
} else {
println!("图表已成功导出为output.png");
}
// 导出为其他格式
kaleido.save(&plot, "output.jpeg", plotly_kaleido::ImageFormat::JPEG).unwrap();
kaleido.save(&plot, "output.webp", plotly_kaleido::ImageFormat::WEBP).unwrap();
kaleido.save(&plot, "output.svg", plotly_kaleido::ImageFormat::SVG).unwrap();
kaleido.save(&plot, "output.pdf", plotly_kaleido::ImageFormat::PDF).unwrap();
kaleido.save(&plot, "output.eps", plotly_kaleido::ImageFormat::EPS).unwrap();
}
完整示例demo
下面是一个更完整的示例,展示如何创建不同类型的图表并导出:
use plotly::{Plot, Scatter, Bar, Layout};
use plotly::common::{Mode, Title};
use plotly_kaleido::{Kaleido, ImageFormat};
fn main() {
// 创建散点图
let trace1 = Scatter::new(vec![1, 2, 3, 4], vec![10, 15, 13, 17])
.name("数据集1")
.mode(Mode::LinesMarkers);
// 创建柱状图
let trace2 = Bar::new(vec![1, 2, 3, 4], vec![16, 5, 11, 9])
.name("数据集2");
// 创建图表并添加布局
let mut plot = Plot::new();
plot.add_trace(trace1);
plot.add_trace(trace2);
// 设置图表布局
let layout = Layout::new()
.title(Title::new("示例图表"))
.x_axis(plotly::LayoutAxis::new().title("X轴"))
.y_axis(plotly::LayoutAxis::new().title("Y轴"));
plot.set_layout(layout);
// 初始化Kaleido导出器
let kaleido = Kaleido::new();
// 导出为多种格式
let formats = [
(ImageFormat::PNG, "output.png"),
(ImageFormat::JPEG, "output.jpg"),
(ImageFormat::SVG, "output.svg"),
(ImageFormat::PDF, "output.pdf"),
];
for (format, filename) in formats {
if let Err(e) = kaleido.save(&plot, filename, format) {
eprintln!("导出{}失败: {}", filename, e);
} else {
println!("成功导出: {}", filename);
}
}
}
功能说明
-
支持多种图像格式导出:
- PNG
- JPEG
- WEBP
- SVG
- EPS
-
高质量渲染:
- 使用Kaleido引擎确保高质量的图表输出
- 保持Plotly图表的原始样式和布局
-
简单易用的API:
- 只需几行代码即可完成图表导出
- 错误处理完善
注意事项
- 这是一个内部crate,主要用于Plotly.rs生态系统
- 需要安装Kaleido二进制文件才能正常工作
- 导出大型图表可能需要较多内存
Rust可视化工具库plotly_kaleido的使用指南
介绍
plotly_kaleido
是一个Rust库,它为Plotly图表提供了静态导出和高质量渲染功能。这个库实际上是Plotly Kaleido库的Rust绑定,Kaleido是一个无头浏览器,专门用于将Plotly图表导出为各种静态格式。
主要特点:
- 支持导出为PNG、JPEG、WebP、SVG、PDF和EPS格式
- 提供高质量的渲染输出
- 不需要外部浏览器或显示服务器
- 跨平台支持
安装
在Cargo.toml中添加依赖:
[dependencies]
plotly = "0.8"
plotly_kaleido = "0.8"
基本使用方法
1. 导出图表到文件
use plotly::{Plot, Scatter};
use plotly_kaleido::Kaleido;
fn main() {
// 创建一个简单的折线图
let trace = Scatter::new(vec![1, 2, 3], vec![4, 5, 6]);
let mut plot = Plot::new();
plot.add_trace(trace);
// 初始化Kaleido
let kaleido = Kaleido::new().expect("Failed to initialize Kaleido");
// 保存为PNG
kaleido
.save(&plot, "output.png", 800, 600)
.expect("Failed to save plot");
// 保存为SVG
kaleido
.save(&plot, "output.svg", 800, 600)
.expect("Failed to save plot");
}
2. 获取图表二进制数据
use plotly::{Plot, Scatter};
use plotly_kaleido::Kaleido;
fn main() {
let trace = Scatter::new(vec![1, 2, 3], vec![4, 5, 6]);
let mut plot = Plot::new();
plot.add_trace(trace);
let kaleido = Kaleido::new().unwrap();
// 获取PNG格式的二进制数据
let png_data = kaleido.to_image(&plot, "png", 800, 600).unwrap();
// 获取SVG格式的字符串
let svg_data = kaleido.to_image(&plot, "svg", 800, 600).unwrap();
}
高级用法
1. 自定义导出选项
use plotly::{Plot, Scatter};
use plotly_kaleido::{Kaleido, KaleidoOptions};
fn main() {
let trace = Scutter::new(vec![1, 2, 3], vec![4, 5, 6]);
let mut plot = Plot::new();
plot.add_trace(trace);
// 自定义Kaleido选项
let options = KaleidoOptions::new()
.scale(2.0) // 缩放因子
.format("png") // 默认格式
.width(1024) // 默认宽度
.height(768); // 默认高度
let kaleido = Kaleido::with_options(options).unwrap();
kaleido.save(&plot, "high_res.png", 1024, 768).unwrap();
}
2. 批量导出图表
use plotly::{Plot, Scatter};
use plotly_kaleido::Kaleido;
fn main() {
let kaleido = Kaleido::new().unwrap();
// 创建多个图表
let plots = vec![
create_plot("Plot 1", vec![1, 2, 3], vec![4, 5, 6]),
create_plot("Plot 2", vec![1, 2, 3], vec![6, 5, 4]),
];
// 批量导出
for (i, plot) in plots.iter().enumerate() {
let filename = format!("plot_{}.png", i + 1);
kaleido.save(plot, &filename, 800, 600).unwrap();
}
}
fn create_plot(title: &str, x: Vec<i32>, y: Vec<i32>) -> Plot {
let trace = Scatter::new(x, y).name(title);
let mut plot = Plot::new();
plot.add_trace(trace);
plot
}
完整示例demo
下面是一个完整的示例,展示如何创建多个图表并使用plotly_kaleido导出:
use plotly::{common::Mode, Plot, Scatter};
use plotly_kaleido::{Kaleido, KaleidoOptions};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建Kaleido实例,带有自定义选项
let kaleido = Kaleido::with_options(
KaleidoOptions::new()
.scale(1.5)
.format("png")
.width(1200)
.height(800),
)?;
// 创建多个不同类型的图表
let plots = vec![
create_line_plot("线性图", vec![1, 2, 3], vec![4, 5, 6]),
create_scatter_plot("散点图", vec![1, 2, 3], vec![6, 5, 4]),
];
// 批量导出图表
for (i, plot) in plots.iter().enumerate() {
let filename = format!("chart_{}.png", i + 1);
kaleido.save(plot, &filename, 1200, 800)?;
println!("已导出: {}", filename);
}
Ok(())
}
// 创建折线图
fn create_line_plot(title: &str, x: Vec<i32>, y: Vec<i32>) -> Plot {
let trace = Scatter::new(x, y)
.name(title)
.mode(Mode::LinesMarkers); // 线+标记点模式
let mut plot = Plot::new();
plot.add_trace(trace);
plot.set_layout(plotly::Layout::new().title(plotly::common::Title::new(title)));
plot
}
// 创建散点图
fn create_scatter_plot(title: &str, x: Vec<i32>, y: Vec<i32>) -> Plot {
let trace = Scatter::new(x, y)
.name(title)
.mode(Mode::Markers); // 仅标记点模式
let mut plot = Plot::new();
plot.add_trace(trace);
plot.set_layout(
plotly::Layout::new()
.title(plotly::common::Title::new(title))
.x_axis(plotly::layout::Axis::new().title("X轴"))
.y_axis(plotly::layout::Axis::new().title("Y轴")),
);
plot
}
注意事项
-
性能考虑:Kaleido的初始化可能比较耗时,建议在应用程序中重用Kaleido实例而不是频繁创建和销毁。
-
错误处理:Kaleido可能因为各种原因失败(如缺少依赖库),请确保正确处理错误。
-
格式支持:确保使用支持的格式(png, jpeg, webp, svg, pdf, eps)。
-
资源清理:Kaleido会启动一个子进程,当Kaleido实例被drop时,子进程会被终止。
-
跨平台:Kaleido支持Windows、macOS和Linux,但可能需要安装额外的系统依赖。
通过plotly_kaleido
,你可以轻松地将Plotly图表导出为高质量的静态图像,非常适合生成报告、文档或网页中的图表。