Rust颜色生成库colorous的使用:提供美观且一致的配色方案,优化数据可视化与UI设计
Rust颜色生成库colorous的使用:提供美观且一致的配色方案,优化数据可视化与UI设计
简介
colorous是一个Rust库,提供了从d3-scale-chromatic移植而来的顺序、发散和分类配色方案集合。每个配色方案可以使用理性索引i/n
或连续浮点数0 ≤ t ≤ 1
进行采样。
主要方法:
pub fn eval_rational(&self, i: usize, n: usize) -> Color
pub fn eval_continuous(&self, t: f64) -> Color
示例
let gradient = colorous::VIRIDIS;
for i in 0..100 {
println!("{:x}", gradient.eval_rational(i, 100));
}
完整示例Demo
use colorous;
fn main() {
// 使用VIRIDIS配色方案生成100个颜色
let gradient = colorous::VIRIDIS;
let colors: Vec<_> = (0..100).map(|i| {
gradient.eval_rational(i, 100)
}).collect();
// 打印颜色值
for (i, color) in colors.iter().enumerate() {
println!("Color {}: {:x}", i, color);
}
// 另一种采样方式 - 使用连续值
let color = gradient.eval_continuous(0.5); // 获取中间值
println!("Middle color: {:x}", color);
// 使用分类配色方案
let category_colors = colorous::CATEGORY10;
for (i, color) in category_colors.iter().enumerate() {
println!("Category color {}: {:x}", i, color);
}
}
配色方案类型
顺序(多色调)
colorous::TURBO
- Anton Mikhailov设计的"turbo"配色方案colorous::VIRIDIS
- van der Walt, Smith和Firing为matplotlib设计的感知均匀的"viridis"配色方案colorous::INFERNO
- van der Walt和Smith为matplotlib设计的感知均匀的"inferno"配色方案colorous::MAGMA
- van der Walt和Smith为matplotlib设计的感知均匀的"magma"配色方案colorous::PLASMA
- van der Walt和Smith为matplotlib设计的感知均匀的"plasma"配色方案colorous::CIVIDIS
- Nuñez, Anderton和Renslow设计的色觉缺陷优化的"cividis"配色方案colorous::WARM
- Niccoli感知彩虹的180°旋转colorous::COOL
- Niccoli的感知彩虹colorous::CUBEHELIX
- Green的默认Cubehelix
顺序(单色调)
colorous::BLUES
colorous::GREENS
colorous::GREYS
colorous::ORANGES
colorous::PURPLES
colorous::REDS
发散
colorous::BROWN_GREEN
colorous::PURPLE_GREEN
colorous::PINK_GREEN
colorous::PURPLE_ORANGE
colorous::RED_BLUE
colorous::RED_GREY
分类
分类配色方案简单地作为数组[Color; N]
公开。
colorous::CATEGORY10
安装
在项目目录中运行以下Cargo命令:
cargo add colorous
或在Cargo.toml中添加:
colorous = "1.0.16"
许可证
Apache License, Version 2.0
1 回复
Rust颜色生成库colorous的使用指南
简介
colorous是一个Rust库,用于生成美观且一致的配色方案,特别适合数据可视化和UI设计场景。它提供了一系列精心设计的颜色梯度,能够帮助开发者快速获得专业的配色方案。
主要特性
- 提供多种预设的配色方案
- 生成平滑的颜色梯度
- 支持从梯度中按比例获取颜色
- 轻量级且无外部依赖
- 完全基于算法生成,无需颜色表
使用方法
添加依赖
首先在Cargo.toml中添加依赖:
[dependencies]
colorous = "1.0"
基本使用示例
use colorous::{Color, Gradient};
fn main() {
// 选择一个预设的梯度方案
let gradient = colorous::TURBO;
// 在0.0到1.0之间获取颜色
let color1 = gradient.eval_continuous(0.0); // 起始颜色
let color2 = gradient.eval_continuous(0.5); // 中间颜色
let color3 = gradient.eval_continuous(1.0); // 结束颜色
println!("起始颜色: {:?}", color1);
println!("中间颜色: {:?}", color2);
println!("结束颜色: {:?}", color3);
}
预设梯度方案
colorous提供了多种预设的梯度方案:
use colorous::{
TURBO, VIRIDIS, MAGMA, INFERNO, PLASMA, CIVIDIS, TWILIGHT, TWILIGHT_SHIFTED, RAINBOW
};
fn print_gradient_samples(gradient: Gradient, name: &str) {
println!("{} 梯度示例:", name);
for i in 0..=10 {
let t = i as f64 / 10.0;
let color = gradient.eval_continuous(t);
println!("位置 {:.1}: RGB({}, {}, {})", t, color.r, color.g, color.b);
}
}
fn main() {
print_gradient_samples(TURBO, "TURBO");
print_gradient_samples(VIRIDIS, "VIRIDIS");
}
离散颜色样本
如果你需要固定数量的离散颜色样本:
use colorous::VIRIDIS;
fn get_discrete_colors(n: usize) -> Vec<colorous::Color> {
(0..n).map(|i| {
let t = i as f64 / (n - 1) as f64;
VIRIDIS.eval_continuous(t)
}).collect()
}
fn main() {
let colors = get_discrete_colors(5);
for (i, color) in colors.iter().enumerate() {
println!("颜色 {}: #{:02x}{:02x}{:02x}",
i, color.r, color.g, color.b);
}
}
与图形库配合使用
以下是与plotters
绘图库配合使用的示例:
use plotters::prelude::*;
use colorous::VIRIDIS;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let root = BitMapBackend::new("gradient.png", (800, 400)).into_drawing_area();
root.fill(&WHITE)?;
let mut chart = ChartBuilder::on(&root)
.caption("Colorous Gradient Demo", ("sans-serif", 30))
.build_cartesian_2d(0.0..1.0, 0..255)?;
for i in 0..=100 {
let x = i as f64 / 100.0;
let color = VIRIDIS.eval_continuous(x);
let rgb = RGBColor(color.r, color.g, color.b);
chart.draw_series(std::iter::once(Rectangle::new(
[(x - 0.01, 0), (x + 0.01, 255)],
rgb.filled(),
)))?;
}
Ok(())
}
应用场景
- 数据可视化:为图表的不同数据系列生成区分度高且美观的颜色
- UI设计:为应用程序创建协调的配色方案
- 热力图:用颜色梯度表示数值强度
- 地图绘制:为不同区域或数值范围着色
注意事项
- 所有颜色值都是sRGB颜色空间中的8位值
- 梯度评估函数
eval_continuous
的参数应在[0.0, 1.0]范围内 - 颜色选择应考虑色盲用户的可见性
colorous库通过提供精心设计的配色方案,大大简化了开发者在可视化项目中的颜色选择过程,使得创建专业外观的图表和界面变得更加容易。
完整示例demo
下面是一个完整的colorous使用示例,展示了如何创建自定义颜色渐变并将其应用于简单的数据可视化:
use colorous::{Color, Gradient};
use plotters::prelude::*;
// 自定义颜色渐变
const CUSTOM_GRADIENT: Gradient = Gradient::new(&[
Color { r: 255, g: 0, b: 0 }, // 红色
Color { r: 255, g: 255, b: 0 }, // 黄色
Color { r: 0, g: 255, b: 0 }, // 绿色
Color { r: 0, g: 0, b: 255 }, // 蓝色
]);
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 示例1: 打印自定义渐变样本
println!("自定义渐变样本:");
for i in 0..=10 {
let t = i as f64 / 10.0;
let color = CUSTOM_GRADIENT.eval_continuous(t);
println!("位置 {:.1}: RGB({}, {}, {})", t, color.r, color.g, color.b);
}
// 示例2: 创建渐变可视化图表
let root = BitMapBackend::new("custom_gradient.png", (800, 400)).into_drawing_area();
root.fill(&WHITE)?;
let mut chart = ChartBuilder::on(&root)
.caption("自定义渐变演示", ("sans-serif", 30))
.build_cartesian_2d(0.0..1.0, 0..100)?;
// 添加渐变条
for i in 0..=100 {
let x = i as f64 / 100.0;
let color = CUSTOM_GRADIENT.eval_continuous(x);
let rgb = RGBColor(color.r, color.g, color.b);
chart.draw_series(std::iter::once(Rectangle::new(
[(x - 0.01, 0), (x + 0.01, 100)],
rgb.filled(),
)))?;
}
// 示例3: 使用离散颜色创建条形图
let discrete_colors = (0..5).map(|i| {
let t = i as f64 / 4.0;
CUSTOM_GRADIENT.eval_continuous(t)
}).collect::<Vec<_>>();
let values = [23, 45, 67, 32, 89];
for (i, &value) in values.iter().enumerate() {
let color = &discrete_colors[i];
let rgb = RGBColor(color.r, color.g, color.b);
chart.draw_series(std::iter::once(Rectangle::new(
[(i as f64 * 0.2 + 0.05, 0), (i as f64 * 0.2 + 0.15, value)],
rgb.filled(),
)))?;
}
Ok(())
}
这个完整示例展示了:
- 如何创建自定义颜色渐变
- 如何打印渐变样本
- 如何将渐变应用于图表背景
- 如何使用离散颜色创建条形图
运行此代码将生成一个PNG图像文件,其中包含自定义渐变的可视化展示和一组使用离散颜色渐变的条形图。