颜色和插值
 
计算机中的颜色,常用的标准有RGB和HSL。
 
RGB:色彩模式是通过对红(Red)绿(Green)蓝(Blue)三个颜色通道相互叠加来得到额各式各样的颜色。三个通道的值得范围都是0~255,因此总共能表示16777216(255*255*255)种,即一千六百多万种颜色。几乎包括了人类所能识别的所有颜色,是应用最广泛的色彩模式。
HSL:色彩模式是通过色相(Hue)饱和度(Saturation)明度(Lightness)三个通道的相互叠加来得到各种颜色的。其中,色相的范围为0°~360°,饱和度的范围为0~1,明度的范围为0~1.色相的取值是一个角度,每个角度可以代表之中的一种颜色,需要记住的是0°或360°代表红色,120°代表绿色,240°代表蓝色。饱和度的数值越大,颜色越鲜艳,灰色越少。明度值用于控制色彩的明暗变化,值越大,越明亮,越接近于白色。值越小,越暗,越接近黑色。
 
RGB颜色和HSL颜色可以相互转换。
 
一 、D3中提供了RGB颜色的创建、调整明暗、转换为HSL模式的方法,方法如下:
 
d3.rgb(r,g,b)
//分别输出r、g、b值来创建颜色,范围都为[0,255]。
 
d3.rgb(color)
//输入相应的字符串来创建颜色,例如:
(1)RGB的十进制值;"rgb(255,255,255)"。
(2)HSL的十进制值: "hsl(120,0.5,0.5)"。
(3)RGB的十六进制值: "#ffeeaa"。
(4)RGB的十六进制值得缩写形式:"#fea"。
(5)颜色的名称: "red","white"。
 
rgb.brighter([k])
//颜色变得更明亮。RGB各通道的值乘以0.7^-k。如果k省略,k的值为1.只有当某通道的值得范围在30~255之间时,才会进行相应的计算。
 
rgb.darker([k])
//颜色变得更暗。RGB各通道的值乘以0.7^k。
 
rgb.hsl()
//返回该颜色对应的HSL值。
 
rgb.toString()
//以字符串形式返回该颜色的值,如"#ffeeaa"。
brighter()darker()返回一个新的颜色对象,不会改变当前颜色对象。hsl()返回当前颜色对应的HSL值,也是一个新的对象。举个例子:
 
 //RGB
var color1 = d3.rgb(40,80,0)
var color2 = d3.rgb("red")
var color3 = d3.rgb("rgb(0,255,255)") //将color1的颜色变亮
console.log(color1.brighter(2)) //返回值的颜色为{r: 81, g: 163, b: 0}
console.log(color1) //原颜色值不变依然返回{r: 40, g: 80, b: 0} //将color2的颜色变亮
console.log(color2.darker(2)) //返回值的颜色为{r: 124, g: 0, b: 0}
console.log(color2) //原颜色值不变依然返回{r: 255, g: 0, b: 0} //输出color3颜色的HSL值
console.log(color3.hsl()) //返回值{h: 180, s: 1, l: 0.5} console.log(color3.toString()) //返回#00ffff
 
二 、HSL颜色的创建和使用与d3.rgb几乎一样,只是各颜色通道的意义不同。
 
d3.hsl(h,s,l)
//根据h、s、l的值来创建HSL颜色。
 
d3.hsl(color)
//根据字符串来创建HSL颜色。
 
hsl.beighter([k])
//变得更亮
 
hsl.darker([k])
//变得更暗
 
hsl.rgb()
//返回对应的RGB颜色。
 
hsl.toString()
//以RGB字符串形式输出该颜色。
 
对于HSL颜色来说,brighter()darker()更好理解,因为HSL的"L"就是明亮度。也就是说,应用brighter()darker()后,只有h、s、l中的第三个颜色通道"l"发生变化。举个例子:
 
 //HSL
var hsl = d3.hsl(120,1.0,0.5); //变得更亮
console.log(hsl.brighter()) //输出{h: 120, s: 1, l: 0.7142857142857143} //变得更暗
console.log(hsl.darker()) //输出 {h: 120, s: 1, l: 0.35} //返回对应的rgb值
console.log(hsl.rgb()) //输出{r: 0, g: 255, b: 0} console.log(hsl.toString()) //输出#00ff00
一般来说,编程人员喜欢使用RGB颜色,比较好理解。美术人员更喜欢使用HSL颜色,方便调整饱和度和亮度。
 
 
三 、插值
 
如果要计算介于两个颜色之间的颜色,需要用到插值(Interpolation)。D3提供了d3.intrerpolateRgb()来处理RGB颜色之间的插值运算,d3.interpolateHsl()来处理HSL颜色之间的插值运算。更方便的是使用d3.interpolate(),它会自动判断颜色的类型。d3.interpolate()也可以处理数值、字符串等之间的插值。举个例子:
 
 //插值
var a = d3.rgb(255,0,0) //红色
var b = d3.rgb(0,255,0) //绿色
var compute = d3.interpolate(a,b) console.log(compute(0)) //输出#ff0000
console.log(compute(0.2)) //输出#cc3300
console.log(compute(0.5)) //输出#808000
console.log(compute(1)) //输出#00ff00 console.log(compute(2)) //输出#00ff00
console.log(compute(-1)) //输出#ff0000
这段代码里,定义了两个RGB颜色:红(255,0,0)绿(0,255,0)。然后,以这两个颜色对象作为d3.interpolate(a,b)的参数。d3.interpolate返回一个函数,保存在变量compute里。于是,compute可当做函数使用,参数是一个数值。
当数值为0时,返回红色。
当数值为1时,返回绿色。
当数值为0~1之间的值时,返回介于红色和绿色之间的颜色。
如果数值超过1,则返回绿色:数值小于0,则返回红色。
 
 

D3.js绘制 颜色:RGB、HSL和插值 (V3版本)的更多相关文章

  1. 利用d3.js绘制雷达图

    利用d3,js将数据可视化,能够做到数据与代码的分离.方便以后改动数据. 这次利用d3.js绘制了一个五维的雷达图.即将多个对象的五种属性在一张图上对照. 数据写入data.csv.数据类型写入typ ...

  2. [js]d3.js绘制拓扑树

    echart也支持拓扑树了 所需的json数据格式: children嵌套 vis.js也支持绘制拓扑树 数据格式: nodes: {id, label, title} edges: {from, t ...

  3. 利用d3.js绘制中国地图

    d3.js是一个比較强的数据可视化js工具. 利用它画了一幅中国地图,例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3ZhcDE=/ ...

  4. d3.js 绘制极坐标图(polar plot)

    0.引言 在极坐标系中,任意位置可由一个夹角和一段相对原点(极点)的距离表示.也就是说,我们可以用 (angle,r) 来表示极坐标系中的点. 1.数据 假设我们有如下数据集[ [10, 0.2], ...

  5. d3.js 绘制北京市地铁线路状况图(部分)

    地铁线路图的可视化一直都是路网公司的重点,今天来和大家一起绘制线路图.先上图. 点击线路按钮,显示相应的线路.点击线路图下面的站间按钮(图上未显示),上报站间故障. 首先就是制作json文件,这个文件 ...

  6. D3.js绘制平行坐标图

    参照:https://syntagmatic.github.io/parallel-coordinates/ 和 https://github.com/syntagmatic/parallel-coo ...

  7. 【 D3.js 高级系列 — 5.1 】 颜色插值和线性渐变

    颜色插值指的是给出两个 RGB 颜色值,两个颜色之间的值通过插值函数计算得到.线性渐变是添加到 SVG 图形上的过滤器,只需给出两端的颜色值即可. 1. 颜色插值 在[高级 - 第 5.0 章]里已经 ...

  8. 【 D3.js 高级系列 — 5.0 】 颜色

    颜色是作图不可少的概念,常用的标准有 RGB 和 HSL,D3 提供了创建颜色对象的方法,能够相互转换和插值. RGB色彩模式是通过对红(Red).绿(Green).蓝(Blue)三个颜色通道相互叠加 ...

  9. 【 D3.js 高级系列 — 6.0 】 值域和颜色

    在[入门 - 第 10 章]作了一张中国地图,其中各省份的颜色值都是随意赋值的.如果要将一些值反映在地图上,可以利用颜色的变化来表示值的变化. 1. 思路 例如,有值域的范围为: [10, 500] ...

随机推荐

  1. MySQL中的关系

    关系 将实体与实体的关系,反应到最终数据库表的设计中来.将关系分为三种:一对一,一对多(多对一)和多对多.所有的关系都是指的是表与表之间的关系. 一对一 一张表中的一条记录一定只能与另外一张表的一条记 ...

  2. OpenGL中的空间变换

    OpenGL中的空间变换          在使用OpenGL的三维虚拟程序中.当我们指定了模型的顶点之后.在屏幕上显示它们之前,一共会发生3种类型的变换:视图变换.模型变换.投影变换.        ...

  3. RLO文件名欺骗

    windows下面,支持一种特殊的unicode字符RLO,一个字符串中如果有这个字符的话,那么在windows下显示时,就会把RLO右侧的字符串逆序显示出来,原始字符串:abcd[RLO]efgh, ...

  4. 编译错误提示PATH_MAX未声明

    解决办法: grep一下,发现PATH_MAX在limits.h中定义,在/scripts/mod/sumversion.c中添加#include <limits.h>即可. #inclu ...

  5. 【JS学习】慕课网4-10 编程练习

    在一个大学的编程选修课班里,我们得到了一组参加该班级的学生数据,分别是姓名.性别.年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦. 学生信息如下: ('小 ...

  6. Gabor滤波器的理解

    搬以前写的博客[2014-02-28 20:03] 关于Gabor滤波器是如何提取出特征点,这个过程真是煎熬.看各种文章,结合百度.文章内部的分析才有一点点明白. Gabor滤波器究竟是什么?   很 ...

  7. mongodb的学习 (2)

    1.条件查询 查询姓名为小明的学生                            db.local.find({name:'小明'});; 查询英语成绩大于90分的同学            ...

  8. 命令行窗口编译执行java

    1:首先配置java环境变量 新建系统环境变量 名称:JAVA_HOME 内容:D:\Program Files\Java\jdk1.7.0_13    为你jdk所在的文件夹位置 修改path路径 ...

  9. FTP的PORT和PASV的连接方式以及数据连接端口号计算

    FTP的PORT和PASV的连接方式以及数据连接端口号计算   PORT(自动)方法的连接途中是: 客户端向服务器的FTP端口(原始是21)发送连接请求,服务器领受连接,建立一条command链路. ...

  10. Final 可重入锁 安全发布

    无状态对象(既不包含任何域,也不包含任何其他类中域的引用)一定是线程安全的. Final fianl域是不能修改的(但如果final域所引用的对象是可变的,那么这些被引用的对象是可变的) 除非需要可变 ...