转载请注明出处!

比例尺简述:

比例尺是一组把输入域映射到输出范围的函数。

一般来说数据集中的值不可能恰好与图表中的像素尺度一一对应。比例尺就是把这些数据值映射到可视化图形中使用的新值的便捷手段。

D3的比例尺就是那些你定义的带有参数的函数。

听到比例尺有些人就会想到最终图表中一系列的刻度线,对应一系列的值,不要搞错,这些刻度显示坐标轴的一部分,而坐标轴只是比例尺的一种形象的表示。比例尺实际上代表的是一种数学关系,不可能直接输出可见的图形。比例尺和坐标轴是两种不同但相关的东西。

下面我们只讨论线性比例尺。

值域和范围:

比例尺的输入值域(input domain)指的是可能的输入值的范围。

比例尺的输出范围(output range)指的是输出值的可能范围。

其实就是归一化,对于线性比例尺,d3可以帮助我们处理归一化过程的数学计算:输入值根据值域先进行归一化,然后再把归一化后的值对应到输出范围。

创建比例尺:

 var scale = d3.scale.linear()

                .domain([100, 500])

                .range([10, 350]);

例如:

scale(100)输出是10,scale(300)输出是180…

缩放散点图:

var dataset = [  

                            [5, 20], [480, 90], [250, 50], [100, 33], [330, 95],  

                            [410, 12], [475, 44], [25, 67], [85, 21], [220, 88]  

                          ];  

返回所有坐标中X值中最大的:

 d3.max(dataset, function(d) {    //返回 480

     return d[0];             //每一个子数组中的第一个位置的值

 });

X轴缩放:

 var xScale = d3.scale.linear()

                 .domain([0, d3.max(dataset, function(d) { return d[0]; })])

                 .range([0, w]);

Y轴缩放:

 var yScale = d3.scale.linear()

                 .domain([0, d3.max(dataset, function(d) { return d[1]; })])

                 .range([0, h]);

设定圆心的坐标(注意使用和坐标同样缩放尺度的坐标值):

.attr("cx", function(d) {

return d[0];

})

缩放后的坐标X值:

 .attr("cx", function(d) {

     return xScale(d[0]);

 })

Y值同样如此:

.attr("cy", function(d) {

return d[1];

})

缩放后的坐标Y值:

 .attr("cy", function(d) {

     return yScale(d[1]);

 })

设定文本坐标值(同上):

.attr("x", function(d) {

return d[0];

})

.attr("y", function(d) {

return d[1];

})

变成:

 .attr("x", function(d) {

     return xScale(d[0]);

 })

 .attr("y", function(d) {

     return yScale(d[1]);

 })

源代码:

 <!DOCTYPE html>  

 <html>  

   <head>  

         <meta charset="utf-8">  

         <title>testD3-10-scale.html</title>  

         <script type="text/javascript" src="d3.v3.js"></script>  

     <style type="text/css">  

         </style>  

     </head>  

     <body>  

         <script type="text/javascript">  

 //Width and height  

             var w = 500;  

             var h = 100;  

             var dataset = [  

                             [5, 20], [480, 90], [250, 50], [100, 33], [330, 95],  

                             [410, 12], [475, 44], [25, 67], [85, 21], [220, 88]  

                           ];  

             //Create scale functions  

             var xScale = d3.scale.linear()  

                                  .domain([0, d3.max(dataset, function(d) { return d[0]; })])  

                                  .range([0, w]);  

             var yScale = d3.scale.linear()  

                                  .domain([0, d3.max(dataset, function(d) { return d[1]; })])  

                                  .range([0, h]);  

             //Create SVG element  

             var svg = d3.select("body")  

                         .append("svg")  

                         .attr("width", w)  

                         .attr("height", h);  

             svg.selectAll("circle")  

                .data(dataset)  

                .enter()  

                .append("circle")  

                .attr("cx", function(d) {  

                     return xScale(d[0]);  

                })  

                .attr("cy", function(d) {  

                     return yScale(d[1]);  

                })  

                .attr("r", function(d) {  

                     return Math.sqrt(h - d[1]);  

                });  

             svg.selectAll("text")  

                .data(dataset)  

                .enter()  

                .append("text")  

                .text(function(d) {  

                     return d[0] + "," + d[1];  

                })  

                .attr("x", function(d) {  

                     return xScale(d[0]);  

                })  

                .attr("y", function(d) {  

                     return yScale(d[1]);  

                })  

                .attr("font-family", "sans-serif")  

                .attr("font-size", "11px")  

                .attr("fill", "red");  

         </script>  

     </body>  

 </html>  

修饰图表:

点大小与圈大小成正比,想把大的放在下面,只要改变Y轴值域倒转即可: .range([h , 0]);

有些圆形的边缘会被切掉一部分,为此引入一个边距变量:

var padding = 20;

以便在设置两个比例尺的时候加入边距,边距可以把圆形往里推,使他们远离SVG的四边,从而避免被切掉。

xScale的返回改为:.range([padding, w-padding]);

但右边的文本仍然会被切掉,可以增大边距2*padding。

原来我们是把每个圆形的半径设置为y值的平方根,现在,我们同样可以为半径设置一个比例尺:

 var rScale = d3.scale.linear()

                       .domain([0, d3.max(dataset,function(d) {
return d[1];
})])
.rangeRound([2, 5]);

然后再这样设定圆的半径:

 .attr("r", function(d) {
return rScale(d[1]);
});

这样所有远的半径就永远介于2~5之间。

其他方法:

nice():

告诉比例尺取得range()设置的任何值域,把两端的值扩展到最接近的整数。“For example, for a domain of [0.20147987687960267, 0.996679553296417], the nice domain is [0.2, 1].”

rangeRound():

代替range之后,比例尺输出的所有值都会舍入到最接近的整数值。对输出值取整有助于图形对应精确地像素值,避免边缘出现模糊不清的锯齿。

clamp():

默认情况下,比例尺可以返回指定范围之外的值。比如,假设给定的值位于输入值域之外,那么比例尺也会返回一个位于输出范围之外的值。调用clamp之后就会强行所有输出值都要在指定范围内。意味着超出范围,会取整到范围的最大值或最小值。

源代码微调:

 <!DOCTYPE html>

 <html lang="en">

          <head>

                    <title>D3: Linear scales with a scatterplot</title>

                    <script type="text/javascript" src="../d3/d3.js"></script>

                    <style type="text/css">

                             /* No style rules here yet */            

                    </style>

          </head>

          <body>

                    <script type="text/javascript">

                             var w = 500;

                             var h = 300;

                             var padding = 20;

                             var dataset = [

                                                                  [5, 20], [480, 90], [250, 50], [100, 33], [330, 95],

                                                                  [410, 12], [475, 44], [25, 67], [85, 21], [220, 88], [600, 150]

                                                           ];

                             //create scales function

                             var xScale = d3.scale.linear()

                                                                            .domain([0, d3.max(dataset,function

                                                                                     (d) {return d[0];})])

                                                                            .rangeRound([padding,w-padding*2]);

                             var yScale = d3.scale.linear()

                                                                            .domain([0, d3.max(dataset,function

                                                                                     (d) {return d[1];})])

                                                                            .rangeRound([h-padding,padding]);

                             var rScale = d3.scale.linear()

                                                                            .domain([0, d3.max(dataset,function

                                                                                     (d) {return d[1];})])

                                                                            .rangeRound([2, 5]);

                             //create SVG element

                             var svg = d3.select("body")

                                                         .append("svg")

                                                         .attr("width", w)

                                                         .attr("height", h);

                             //create circles

                             svg.selectAll("circle")

                                      .data(dataset)

                                      .enter()

                                      .append("circle")

                                      .attr("cx", function(d) {  

                                                return xScale(d[0]);

                                      })

                                      .attr("cy", function(d) {

                                               return yScale(d[1]);

                                      })

                                      .attr("r", function(d) {

                                            return rScale(d[1]);

                                });

                             //create text elements

                             svg.selectAll("text")

                                      .data(dataset)

                                      .enter()

                                      .append("text")

                                      .text(function(d){

                                                return d[0] + "," + d[1];

                                      })

                                      .attr("x", function(d) {

                                            return xScale(d[0]);

                                })

                                .attr("y", function(d) {

                                            return yScale(d[1]);

                                })

                                .attr("font-family", "sans-serif")

                                .attr("font-size", "11px")

                                .attr("fill", "red");

                    </script>

          </body>

 </html>

效果图:

For my lover, CC!

参考书籍:《数据可视化实战》

D3基础---比例尺的更多相关文章

  1. 数据可视化(7)--D3基础

    一直想写写D3,觉得D3真心比较强大,基本上你能想出来的图表都能绘制出来,只不过使用起来比前几个要稍麻烦一点. 正好最近读完了<数据可视化实战>,将关于D3的知识梳理了一遍,写这篇博客记录 ...

  2. D3.js比例尺 定量比例尺 之 线性比例尺(v3版本)

    定量比例尺 : 数学上有函数的概念,不是编程中所说的函数,如线性函数.指数函数.对数函数等,而指的是一个量随着另一个量的变化而变化.例如有一下线性函数 : y=2x+1该函数在二维坐标系中绘制出来的图 ...

  3. D3.js 比例尺的使用

    比例尺是 D3 中很重要的一个概念,直接用数值的大小来代表像素不是一种好方法 一.为什么需要比例尺 制作一个柱形图,会有一个数组:var dataset = [ 250 , 210 , 170 , 1 ...

  4. D3基础--数轴

    转载请注明出处! 概述: 与比例尺类似,D3的数轴实际上也使用来定义参数的函数.但与比例尺不同的是,调用数轴函数并不会返回值,而是会生成数轴相关的可见元素.包括:轴线,标签和刻度. 但是要注意数轴函数 ...

  5. D3.js比例尺 序数比例尺(v3版本)

    上一章介绍了阈值比例尺:https://www.cnblogs.com/littleSpill/p/10825038.html.到目前所有的定量比例尺已经介绍完了. 现在给大家介绍一下序数比例尺. 定 ...

  6. D3基础---简介和数据

    D3.js是一种数据操作类型的javascript库(也可视其为插件):结合HTML,SVG和CSS,D3可以图形化的,生动的展现数据. d3获取:http://d3js.org/ 在代码文件中引入D ...

  7. d3基础图形模板笔记

    散点图(scatter plot): http://bl.ocks.org/weiglemc/6185069 雷达图(radar): http://xgfe.github.io/uploads/che ...

  8. d3基础入门一-选集、数据绑定等核心概念

    引入D3 D3下载,本文下载时的版本为6.5.0 mkdir d3.6.5.0 unzip --help unzip d3.zip -d d3.6.5.0/ ls d3.6.5.0/ API.md C ...

  9. D3基础入门四-事件处理

    6.5.0版 .on("mouseover", function(e,d) e: {"isTrusted":true} 第二个参考才是数据,但这在不同的环境可能 ...

随机推荐

  1. asp.net(mvc) 框架

    1.NFine mvc+ef 2.Grove orm架构 3.NHibernate orm 4.NBear 5.petshop 6.Membership 7.Brnshop 网上商城 8.cms快速开 ...

  2. VSM Import Cluster功能验证一(准备篇)

    一.概述 本文档记录了VSM Import Cluster功能验证过程及过程中遇到的问题. 二.准备 2.1.网络规划 1) Management Network:VSM控制节点对其他节点的管理网络, ...

  3. swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~

    title: swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~description: 阅读 sowft 框架源码, swoft 第一步, ...

  4. kvm虚拟化之kvm虚拟机控制台登陆

    vm虚拟机能否像xen虚拟机一样通过virsh console 一样采用字符界面进行linux虚拟机控制台呢,答案是肯定的,默认情况下该命令是不起作用的,需要修改相关文件才能实现. 1. 配置方法如下 ...

  5. kali linux之应用层Dos

    应用层服务漏洞: 服务代码存在漏洞,遇异常提交数据时程序崩溃 应用处理大量并发请求能力有限,被拒绝的是应用或OS 缓冲区溢出漏洞: 向目标函数随机提交数据,特定情况下数据覆盖临近寄存器或内存 影响:远 ...

  6. JAVA输入随笔

    做题时经常遇到输入的问题,很麻烦 写一点点自己对于输入的随笔,以备后查 这里都以整数为例,其他类型的话换成相应方法就行了 1.知道一共多少行,每一行只有一个整数 这是比较简单的输入,可以用Scanne ...

  7. 编程开发之--Oracle数据库--存储过程和存储函数(1)

    1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or re ...

  8. 04. H5标签有哪些?行内元素有哪些?块级元素有哪些?空(void)元素有哪些?行内元素和块级元素有什么区别?你工作中常用标签有什么?

    4. H5标签有哪些? 2)行内元素有哪些? a - 锚点 em - 强调 img - 图片 font - 字体设定 ( 不推荐 ) i - 斜体 input - 输入框 3)块级元素有哪些? add ...

  9. tp5 重定向缺少index.php报错(No input file specified)

    转别人的,有用,Mark一下 public 下的.htaccess 修改为 <IfModule mod_rewrite.c>  Options +FollowSymlinks -Multi ...

  10. nginx windows 安装为服务.

    安装Nginx 下载windows版nginx (http://nginx.org/download/nginx-1.10.0.zip),之后解压到需要放置的位置(D:\xampp\nginx) 将N ...