【 D3.js 高级系列 — 5.1 】 颜色插值和线性渐变
颜色插值指的是给出两个 RGB 颜色值,两个颜色之间的值通过插值函数计算得到。线性渐变是添加到 SVG 图形上的过滤器,只需给出两端的颜色值即可。

1. 颜色插值
在【高级 - 第 5.0 章】里已经提到了颜色插值,在这里做一个例子。先定义颜色插值函数如下,
var a = d3.rgb(255,0,0); //红色
var b = d3.rgb(0,255,0); //绿色 var compute = d3.interpolate(a,b);
如此一来,compute 可当做函数使用,参数的范围为[0, 1]。compute(0) 返回红色,compute(1) 返回绿色,传入 0 ~ 1 之间的值时,返回红色到绿色之间的插值颜色。
有时候,某个值域的范围并不在 0 到 1 之间,例如在 0 到 150 之间,怎么讲二者对应起来呢?使用一个线性比例尺即可,定义如下,
var linear = d3.scale.linear()
.domain([0,150])
.range([0,1]);
在计算颜色值时,只要 compute(linear(x))即可,x的范围是 0 到 150 。
下面绘制150个矩形,分为10行,每行15个,用颜色插值函数分别计算每个矩形的填充色。
var rects = svg.selectAll("rect")
.data(d3.range(150))
.enter()
.append("rect")
.attr("x",function(d,i){
return i%15 * 15;
})
.attr("y",function(d,i){
return Math.floor(i/15) * 15;
})
.attr("width",15)
.attr("height",15)
.style("fill",function(d){
return compute(linear(d));
});
结果如下图,

2. 线性渐变过滤器
有时需要在一个图形上使用渐变的颜色,渐变表示一种颜色平滑过渡到另一种颜色。SVG中有线性渐变<linearGradient>和放射性渐变<radialGradient>。下面以线性渐变为例来说明渐变的使用方法。
渐变也是定义在<defs>标签中的,然后给渐变定义一个id号,在需要使用的图形上调用此id号即可。
<defs>
<linearGradient id="myGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#F00" />
<stop offset="100%" stop-color="#0FF" />
</linearGradient>
</defs>
x1、y1、x2、y2用于定义渐变的方向,此处表示的是水平渐变。offset定义渐变开始的位置,stop-color定义此位置的颜色。接下来使用此渐变:
<rect fill="url(#myGradient)"
x="10" y="10" width="300" height="100"/>
那么,在 D3 中的代码是怎样的呢?按照线性渐变的元素结构添加相应的元素即可,
//定义一个线性渐变
var defs = svg.append("defs"); var linearGradient = defs.append("linearGradient")
.attr("id","linearColor")
.attr("x1","0%")
.attr("y1","0%")
.attr("x2","100%")
.attr("y2","0%"); var stop1 = linearGradient.append("stop")
.attr("offset","0%")
.style("stop-color",a.toString()); var stop2 = linearGradient.append("stop")
.attr("offset","100%")
.style("stop-color",b.toString());
然后再添加到一个矩形上,代码如下,
//添加一个矩形,并应用线性渐变
var colorRect = svg.append("rect")
.attr("x", 15)
.attr("y", 200)
.attr("width", 200)
.attr("height", 30)
.style("fill","url(#" + linearGradient.attr("id") + ")");
结果如下图,

3. 结果
总结上面的内容,并添加了一些交互式的内容,以便各位读者看清楚,结果如下。
点击下面的地址,右键点浏览器查看代码:
http://www.ourd3js.com/demo/G-5.1/colorinterpolate.html
谢谢阅读。
文档信息
- 版权声明:署名(BY)-非商业性(NC)-禁止演绎(ND)
- 发表日期:2015 年 5 月 9 日
- 更多内容:OUR D3.JS - 数据可视化专题站 和 CSDN个人博客
- 备注:本文发表于 OUR D3.JS ,转载请注明出处,谢谢
【 D3.js 高级系列 — 5.1 】 颜色插值和线性渐变的更多相关文章
- 【 D3.js 高级系列 】 总结
高级系列的教程已经完结,特此总结. 月初的时候曾说过本月内完结高级教程,今天是最后一天,算是可以交差了.O(∩_∩)O~ 如此一来,[入门]-[进阶]-[高级]三个系列的教程算是完成了.本教程的目的在 ...
- 【 D3.js 高级系列 — 6.0 】 值域和颜色
在[入门 - 第 10 章]作了一张中国地图,其中各省份的颜色值都是随意赋值的.如果要将一些值反映在地图上,可以利用颜色的变化来表示值的变化. 1. 思路 例如,有值域的范围为: [10, 500] ...
- 【 D3.js 高级系列 — 5.0 】 颜色
颜色是作图不可少的概念,常用的标准有 RGB 和 HSL,D3 提供了创建颜色对象的方法,能够相互转换和插值. RGB色彩模式是通过对红(Red).绿(Green).蓝(Blue)三个颜色通道相互叠加 ...
- 【 D3.js 高级系列 — 4.0 】 矩阵树图
矩阵树图(Treemap),也是层级布局的扩展,根据数据将区域划分为矩形的集合.矩形的大小和颜色,都是数据的反映.许多门户网站都能见到类似图1,将照片以不同大小的矩形排列的情形,这正是矩阵树图的应用. ...
- 【 D3.js 高级系列 — 2.0 】 捆图
捆图(Bundle)是 D3 中比较奇特的一个布局,只有两个函数,而且需要与其它布局配合使用.本文讲述捆图的制作方法. 有关捆图的例子极少,很容易找到的是:http://bl.ocks.org/mbo ...
- 【 D3.js 高级系列 — 1.0 】 文本的换行
在 SVG 中添加文本是使用 text 元素.但是,这个元素不能够自动换行,超出的部分就显示不出来了,怎么办呢? 高级系列开篇前言 从今天开始写高级系列教程.还是那句话,由于本人实力有限,不一定保证入 ...
- 【 D3.js 高级系列 — 2.0 】 机械图 + 人物关系图
机械图(力路线图)结合老百姓的关系图中的生活,这是更有趣. 本文将以此为证据,所列的如何图插入外部的图像和文字的力学. 在[第 9.2 章]中制作了一个最简单的力学图.其后有非常多朋友有疑问,基本的问 ...
- 【 D3.js 高级系列 — 3.0 】 堆栈图
堆栈图布局(Stack Layout)能够计算二维数组每一数据层的基线,以方便将各数据层叠加起来.本文讲解堆栈图的制作方法. 先说说什么是堆栈图. 例如,有如下情况: 某公司,销售三种产品:个人电脑. ...
- 【 D3.js 高级系列 — 1.1 】 封装文本自动换行
在[高级 - 第 1.0 章]中讲解了在 SVG 中如何配合使用 text 和 tspan 来实现换行的功能,本文对此功能进行一下封装,以后就可以直接用了. 1. 引用 js 文件 下载地址:mult ...
随机推荐
- 使用公钥登录SSL
在本地生成密钥对 ssh-keygen -t rsa 如果不想设置密码,可以直接点击回车. 如果你想使用DSA可以用-t DSA替换. 确保远程计算机上用户目录下有.ssh目录 确保你的连接服务器上的 ...
- 自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)
很多高端机械键盘,支持宏定义,例如我们可以设置"D"键为"dota",这样当我们按一下宏开启键,再按一下"D"键,就等价于分别按了" ...
- HTML 菜单 a 标签设置样式
html: "<div style='font-weight:800;color:red'> <a href='javascript:void(0)'style='colo ...
- Python拷贝及多进程与类的问题
最近写python写的尤其不顺利,更多的debug,逐渐的深入,产出却比较少.应该是个瓶颈期,坚持坚持,厚着脸皮也要坚持下去. 0x00 拷贝问题 程序中涉及到多进程和协程,大致的模型是开了2+个进程 ...
- 一个有意思的js实例,你会吗??[原创]
首先,看看下面一个js例子,你觉得会输出什么呢? function fn(a){ a(); function a(){ console.log(2); } var a = function(){ co ...
- Myeclipse 2013 professional 破解,下载
昨天重装了系统,今天重新搭建开发环境,就顺便把Myeclipse升级到了2013,点击下载Myeclipse2013.惯例,需要破解Myeclipse2013,不过我发现我之前的破解Myeclipse ...
- maven+tomcat6-maven-plugin实现热部署及调试
maven project,特别是maven module项目默认情况下是是无法直接通过tomcat等容器部署的,如图,我要部署fastdev_web这个maven module,可以看出在tomca ...
- Delphi XE5 android 获取电池电量
uses AndroidAPI.JNI.GraphicsContentViewText, AndroidAPI.JNI.JavaTypes, AndroidAPI.JNI.OS; function B ...
- 1185: [HNOI2007]最小矩形覆盖 - BZOJ
就是一道凸包(枚举凸包的边作为矩形的一条边)的裸题,只是不太好打,所以犹豫到今天才打 不说了,说起AC都是泪啊,因为没有精度判断,没有判重(算距离时除0了)错了好久 拍了好久都和标称是一样的,因为 ...
- jquery中json数据转换为字典
首先在前台页面中的json数据为 var recipe = {}; recipe["name"] = $("#name").val(); recipe[&quo ...