【D3.js数据可视化系列教程】--(十二)比例尺

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhang__tianxu/article/details/11761895

1. D3中的比例尺

比例尺就是一个数据映射函数,比如线性比例尺可以实现类似y=ax+b的变换。D3一共有三类九种比例尺(其中4种颜色比例尺算序数比例尺的特例):

比例尺

我们一般采用线性比例尺。

  2. 定义域和值域

比例尺有两个最重要的函数:

  • .domain([100, 500]) 定义域范围
  • .range([10, 350]) 值域范围

下面就是定义比例尺的方法:


    
    
  1. var scale = d3.scale.linear()
  2. .domain([ 100, 500])
  3. . range([ 10, 350]);

比例尺最终都会对定义域执行相应的函数变换,然后再把这个中间数据线性变换到值域范围上。

  3. 坐标轴的缩放

  • 最大的X

    
    
  1. d3.max(dataset, function(d) { //返回 480
  2. return d[ 0]; //返回每个子数组的第一个元素
  3. });
  • X轴缩放

    
    
  1. var xScale = d3.scale.linear()
  2. .domain([ 0, d3.max(dataset, function(d) { return d[ 0]; })])
  3. .range([ 0, w]);
  • Y轴缩放

    
    
  1. var yScale = d3.scale.linear()
  2. .domain([ 0, d3.max(dataset, function(d) { return d[ 1]; })])
  3. .range([ 0, h]);

  4. 设定圆心的坐标

注意要使用和轴一致的比例尺。


    
    
  1. .attr( "cx", function(d) {
  2. return d[ 0];
  3. })

缩放后的坐标X值


    
    
  1. .attr( "cx", function(d) {
  2. return xScale(d[ 0]);
  3. })

Y值同样如此:


    
    
  1. .attr( "cy", function(d) {
  2. return d[ 1];
  3. })

修改后就是:


    
    
  1. .attr( "cy", function(d) {
  2. return yScale(d[ 1]);
  3. })

  5. 设定文本坐标值(同上)


    
    
  1. .attr( "x", function(d) {
  2. return d[ 0];
  3. })
  4. .attr( "y", function(d) {
  5. return d[ 1];
  6. })

变成:


    
    
  1. .attr( "x", function(d) {
  2. return xScale(d[ 0]);
  3. })
  4. .attr( "y", function(d) {
  5. return yScale(d[ 1]);
  6. })

  6. 源码


    
    
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>testD3-10-scale.html </title>
  6. <script type="text/javascript" src="d3.js"> </script>
  7. <style type="text/css">
  8. </style>
  9. </head>
  10. <body>
  11. <script type="text/javascript">
  12. //高宽
  13. var w = 500 ;
  14. var h = 100 ;
  15. var dataset = [
  16. [ 5 , 20 ], [ 480 , 90 ], [ 250 , 50 ], [ 100 , 33 ], [ 330 , 95 ],
  17. [ 410 , 12 ], [ 475 , 44 ], [ 25 , 67 ], [ 85 , 21 ], [ 220 , 88 ]
  18. ];
  19. //Create scale functions
  20. var xScale = d3.scale.linear()
  21. .domain([ 0 , d3.max(dataset, function(d) { return d[ 0 ]; })])
  22. .range([ 0 , w]);
  23. var yScale = d3.scale.linear()
  24. .domain([ 0 , d3.max(dataset, function(d) { return d[ 1 ]; })])
  25. .range([ 0 , h]);
  26. //创建SVG
  27. var svg = d3.select( "body" )
  28. .append( "svg" )
  29. .attr( "width" , w)
  30. .attr( "height" , h);
  31. svg.selectAll( "circle" )
  32. .data(dataset)
  33. .enter()
  34. .append( "circle" )
  35. .attr( "cx" , function(d) {
  36. return xScale(d[ 0 ]);
  37. })
  38. .attr( "cy" , function(d) {
  39. return yScale(d[ 1 ]);
  40. })
  41. .attr( "r" , function(d) {
  42. return Math .sqrt(h - d[ 1 ]);
  43. });
  44. svg.selectAll( "text" )
  45. .data(dataset)
  46. .enter()
  47. .append( "text" )
  48. .text( function(d) {
  49. return d[ 0 ] + "," + d[ 1 ];
  50. })
  51. .attr( "x" , function(d) {
  52. return xScale(d[ 0 ]);
  53. })
  54. .attr( "y" , function(d) {
  55. return yScale(d[ 1 ]);
  56. })
  57. .attr( "font-family" , "sans-serif" )
  58. .attr( "font-size" , "11px" )
  59. .attr( "fill" , "red" );
  60. </script>
  61. </body>
  62. </html>

  7. 效果


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

  • 注:为了SVG边缘不被截断可以设置边距: .range([h - padding, padding]);

  • 注:自定义半径比例尺:


    
    
  1. var rScale = d3.scale.linear()
  2. .domain([ 0, d3.max(dataset, function(d) { return d[ 1]; })])
  3. .range([ 2, 5]);

然后,这样设置半径


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值