d3学习之(Data Visualization with d3.js Cookbook )(第四章)-3

3.使用分类范围尺

在某些情况下,我们可能需要将我们的数据映射到一些分类的(顺序的)值,比如[a,b,c]或者[# 1f77b4, # ff7f0e, #2ca02c]等,如何用D3来处理这类映射呢,本节将回答这个问题。

老规矩还是先上代码,打开你的编辑器,输入如下代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Ordinal Scale</title>
    <link rel="stylesheet" type="text/css" href="styles.css"/>
    <script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
</head>

<body>

<div id="alphabet" class="clear">
    <span>Ordinal Scale with Alphabet<br></span>
    <span>Mapping [1..10] to ["a".."j"]<br></span>
</div>
<div id="category10" class="clear">
    <span>Ordinal Color Scale Category 10<br></span>
    <span>Mapping [1..10] to category 10 colors<br></span>
</div>
<div id="category20" class="clear">
    <span>Ordinal Color Scale Category 20<br></span>
    <span>Mapping [1..10] to category 20 colors<br></span>
</div>
<div id="category20b" class="clear">
    <span>Ordinal Color Scale Category 20b<br></span>
    <span>Mapping [1..10] to category 20b colors<br></span>
</div>
<div id="category20c" class="clear">
    <span>Ordinal Color Scale Category 20c<br></span>
    <span>Mapping [1..10] to category 20c colors<br></span>
</div>

<script type="text/javascript">
    var max = 10, data = [];
    for (var i = 0; i < max; ++i) data.push(i); // <-A

    var alphabet = d3.scale.ordinal() // <-B
        .domain(data)
        .range(["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]);

    function render(data, scale, selector) { // <-C
        d3.select(selector).selectAll("div.cell")
                    .data(data)
                .enter().append("div").classed("cell", true);
        d3.select(selector).selectAll("div.cell")
                    .data(data)
                .exit().remove();
        d3.select(selector).selectAll("div.cell")
                    .data(data)
                .style("display", "inline-block")
                .style("background-color", function(d){  // <-D
                    return scale(d).indexOf("#")>=0?scale(d):"white";
                })
                .text(function (d) { // <-E
                    return scale(d);
                });
    }
    render(data, alphabet, "#alphabet"); // <-F
    render(data, d3.scale.category10(), "#category10");
    render(data, d3.scale.category20(), "#category20");
    render(data, d3.scale.category20b(), "#category20b");
    render(data, d3.scale.category20c(), "#category20c"); // <-G
</script>

</body>

</html>

运行该代码我们将看到下图的结果:

这种类型的映射在数据可视化中非常常见,比如你可能想要将特定的数据点映射成对应的字符串或者是RGB代码,这样你就可以应用到CSS样式中。D3提供了专业的范围尺函数来完成这项工作,下面我们就来详细看看上面例子的代码。

在上面的例子中代码A处定义了一个简单的从0到9的数组。

var max = 10, data = [];

for (var i = 0; i < max; ++i) data.push(i); // <-A

接着在B行调用d3.scale.ordinal()方法,创建了一个分类范围尺,然后将其定义域设置为我们在A处创建的数组即0-9的数字,将值域设置成字母表中的a-j。当范围尺定义后,我们可以调用scale函数来完成数字到字母的映射,比如调用alphabet(0)将得到a,alphabet(4)将得到e。等等。

在C处,render函数被定义用来创建分别代表了数组中数字的10个div元素到页面中。每个div元素的背景色被设置成scale函数的返回值或者是白色如果返回值不是RGB代码。

function render(data, scale, selector) { // <-C

d3.select(selector).selectAll("div.cell")

.data(data)

.enter().append("div").classed("cell", true);

d3.select(selector).selectAll("div.cell")

.data(data)

.exit().remove();

d3.select(selector).selectAll("div.cell")

.data(data)

.style("display", "inline-block")

.style("background-color", function(d){  // <-D

return scale(d).indexOf("#")>=0?scale(d):"white";

在E处,我们将scale函数的返回值赋值给每个div的text,将其现实在页面中。

.text(function (d) { // <-E

return scale(d);

});

现在所有的框架我们都搭建完毕,从F到G行,render函数被多次调用,并且使用不同的分类范围尺来产生不同的输出效果,在F行我们是使用字母表的映射,后面分别使用了D3内建的不同的颜色范围尺,因为给不同元素分配不同的颜色是可视化常用到的,比如饼图、表格等,所以d3为我们准备了很多不同的颜色范围尺,比如本例中的几个,你同样也可以自己通过将分类范围尺的值域设置成你想要的颜色来定义自己的颜色范围尺,比如:

d3. scale.ordinal() .range([# 1f77b4, # ff7f0e, # 2ca02c]

时间: 2024-10-10 07:35:23

d3学习之(Data Visualization with d3.js Cookbook )(第四章)-3的相关文章

D3 &amp; Data Visualization in Ext JS

通过适配器可以在ExtJs中轻松的集成D3的展示能力 http://video.sencha.com/watch/zvUjnFJ91xVvuwdTh2zjqP?mkt_tok=eyJpIjoiWm1aaE1USmxNalZrWkRjeiIsInQiOiJjN0pTRHUrd2dWNjA3VVFDaitidTJ3QVd2NnJUMjk4SmF4SUlcL1BNbHdOcURNblViZVJNUTljakVvZGVpVXF3am1FQXlyWGthNmw5WXI3aVRFMFBTbTZhWmZ2eC

ntv.js框架(第四章) - 1common.js和2core.js

1common.js源代码: 全局 $ 对象,类似于jQuery框架的命名形式,用于缩短函数名,精简代码.此文件只包含提供全局作用域的常用对象. var $ = function(selector){};   // Id选择器的函数封装.调用$("#Id"),$("TagName") $.ajax = function(o){};           // aJax功能的函数封装.调用$.ajax({type: POST, url: "...",

简单的学习心得:网易云课堂Android开发第四章服务、广播与酷特性

1.Service (1)含义:Service是在后台长时间运行的应用组件,所在线程是main线程. (2)使用方式:startService能够执行onStartCommand中操作,bindService能够将Service的实例对象返回给Activity,从而能够在Activity中使用Service的方法.而用new方法创建Service对象,没有报错,但无法成功调用Service的方法. (3)注意:在onStartCommand中,老师建议我们将返回值改为START_NOT_STIC

深度学习之美(张玉宏)——第四章 人生苦短我用python

1 函数参数 (1)收集参数:以一个星号*加上形参名的方式,表示这个函数的实参个数不定,可能0个可能n个. def varParaFun(name,*param): print('位置参数是:',name) print('收集参数是:',param) print('第一个收集参数是:',param[0]) varParaFun('数据之美','hello',123,'abc') #位置参数是: 数据之美 #收集参数是: ('hello', 123, 'abc') #第一个收集参数是: hello

D3学习笔记一 bars in angular

1 使用factory在页面添加d3.js.也可以选择在页面直接引入d3.js. d3.factory('d3Service',['$document','$q', '$rootScope', function($document, $q, $rootScope){ var d = $q.defer(); function onScriptLoad(){ $rootScope.$apply(function(){d.resolve(window.d3);}) } // 建立一个D3的脚本标签,当

d3可视化实战02:理解d3数据驱动的真正含义

前文中已经提到,SVG从诞生之初起就可以非常方便地使用javascript脚本语言来进行其DOM对象的控制.当然,控制的方法有很多,有直接控制SVG对象的方法,例如使用原生js:有帮你封装一下图形接口再进行直接控制的js类库,如 Raphaël.但是正如我在第一篇文章中所说,d3作为一个中间型类库还能脱颖而出的重要原因,在于它突破了其他类库的那种直接控制表现层的机制,而采用了对于web图形处理领域较为新颖的数据驱动机制(2011),并获得了极大的成功. 数据驱动的历史 数据驱动编程并不是一个新鲜

[D3] Build a Line Chart with D3 v4

Line charts are often used to plot temporal data, like a stock price over time. In this lesson we’ll see how to use D3 APIs to create our own simplified version of the charts seen on Google Finance. var margin = { top: 10, right: 20, bottom: 65, left

伊利诺伊大学香槟分校 Data Visualization 课程 笔记1

1. 定义 Data visualization is a high bandwidth connection between data on a computer system and a human brain, facilitated by visual communication. 2. 特征 洞悉数据,通过对数据的深入观察来帮助做进一步的决策,为后续探索研究提供进一步的假设. 3. 推荐书籍 The visual display of quantitative information

Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次更新已经比较久了^_^! formidable简介 nodejs原生实现上传还是比较麻烦,有兴趣的自已去参考一下网上有网友写的代码 这里选择了formidable,也是githu