D3学习指北–第四章,比例尺和坐标轴

本文介绍了D3.js中比例尺(包括线性、序数、指数与对数比例尺)的概念和使用方法,强调了比例尺在处理无限大数据到有限显示范围中的作用。此外,还详细讲解了坐标轴的创建、设置和应用,以及如何通过比例尺来创建坐标轴,展示了坐标轴在数据可视化的关键作用。最后,通过实例演示了如何建立和美化一个坐标系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

D3学习指北–第四章,比例尺和坐标轴

1、前言

  虽然上节我们画了柱形图,但是,其中还有很多的地方需要完善,最重要的一点就是我们的坐标轴还没有完成,那么我们今天所学的内容,能帮我们给柱形图加上坐标轴,
首先,我们先思考一个问题,这样能更有效的帮助我们学习今天的内容。

  • 我们的网页宽度有限,坐标轴表示的数据无限大,我们怎么把无限大的数据放到有限的长度内呢?

  D3给出的解决方法是“比例尺”,功能是能把一个区间映射到一个你想要的数据区间中,这也应该是我们大多数人想到的方法。
下面就开始了今天的讲解,因为立坐标轴需要用到“比例尺”,所以我们前面会先讲解比例尺,可能会有点唐突,但是他是坐标轴的前提。

2、比例尺

  因为将数据区间映射成另外一种数据区间的情况有很多,比如:一个数据区间要按照线性比例映射另一个区间,也可能是按照指数比例映射,当然,也可能是按照离散的方式映射。不过,这些所有的工具都叫做比例尺,这一个小分段就是讲解各种比例尺。

  • 特别提示:比例尺只是坐标轴前置的一个工具,但是它的作用不仅仅是服务坐标轴。

比例尺的声明格式都一样,只有一些略微的差别。

d3.scala.声明比例尺的方法名().domain([比例尺的原始区间]).映射区间取值或跨度的方法([比例尺的映射区间])

线性比例尺

  线性比例尺与线性函数类似,是倍数关系的映射到对应的区间

  • d3.scala.linear()
      创建一个线性比例尺
  • linear.domain([numbers])
      设置比例尺的原始区间,也可以用于查看原始区间
  • linear.range([values])
      设置比例尺的映射区间,也可以用于查看映射区间
  • linear(x)
      返回x在比例尺映射区间内的值
  • linear.invert(x)
      返回x在比例尺原始区间内的值
	var linear= d3.scale.linear(); //声明一个线性比例尺
	linear.domain([10,20]); //设定比例尺的原始区间为 [10,20]
	linear.range([0,100]); //设定比例尺的映射区间为 [0,20]
	console.log(linear(18)); //80
	console.log(linear.invert(88)); //18.8

这几个方法是比例尺用的最多的方法,下面简单介绍以下不常用的方法,这些方法只需要知道有就行。

  • linear.rangeRound([values])
      可以替代range()方法,这个方法比例尺返回的数据会四舍五入取整。
  • linear.clamp()
      设置比例尺超出原始区间时返回的值
  • linear.nice()
      将原始区间跟映射区间变为整数区间
  • linear.ticks([count])
      这个方法下面演示不做解释

  这些方法大家可以了解,用到的时候查询一下就可以了,我们是指北,而非详细介绍。

序数比例尺

  序数比例尺是离散的映射,即不是连续的映射,列如.domain[1,2,3] .range[“red”,“green”,“blue”];这个例子是1映射为"red",等。

  • d3.scala.ordinal()
      创建一个序数比例尺
    -ordinal.domain([values])
      设置比例尺的原始区间,也可以用于查看原始区间
    -ordinal.range([values])
      设置比例尺的映射区间,也可以用于查看映射区间
    -ordinal(x)
      返回x对应的映射区间的值
    -ordinal.rangeBands(interval)
      代替range()设置映射区间,接受一个映射区间,分割成原始区间的元素个数
    -ordinal.rangeRoundBands(interval)
      跟rangeBands()一样,结果会取整
	var ordinal= d3.scale.ordinal(); //声明一个线性比例尺
	ordinal.domain([1,2,3]); //设定比例尺的原始区间为 [1,2,3]
	ordinal.range(["red","green","blue"]); //设定比例尺的映射区间为 ["red","green","blue"]
	console.log(ordinal(2)); //green
	ordinal.rangeBands([0,301]); 
	console.log(ordinal(2)); //100.333333333333
	ordinal.rangeRoundBands([0,301]);
	console.log(ordinal(2)); //101

上面的方法是常用的,下面介绍不常用的几个方法。
-ordinal.rangePoints([interval])
  与rangeBands()一样,分割的方法不同
-ordinal.rangeRoundPoints([interval])
  与rangeRoundBands()一样,分割的方法不同,想了解的同学可以查询一下两个的分割方法
-ordinal.rangeBand()
  返回使用rangeBands()设定后的每一段宽度
-ordinal.rangeExtend()
  返回一个数组,数组里存有值域的最大值和最小值

  同上一个一样,这些方法了解就好,另外因为我本人讲究实用性,所以比例尺的顺序对应着实用性的高低。

指数与对数比例尺

  指数与对数比例尺方法的内容与线性比例尺的内容方法一样,但是声明方法不一样

  • d3.scale.pow().exponent(3)
      创建一个指数为3的指数比例尺
  • d3.scale.pow().base(3)
      创建一个底数为3的对数比例尺

其余的添加原始区间与映射区间的的方法与线性比例尺一样

另外还有量子和分位比例尺,用的情况不多,为了不浪费篇幅,可以了解一下,应用的时候可以自行查看应用方法

3、坐标轴

因为坐标轴长度有限,而数据是无限大的,所以作者想了一个巧妙设计:把比例尺安装到坐标轴上,就可以用一段坐标轴,显示无限大的数。

下面给大家介绍一下坐标轴创建及其方法:

  • d3.svg.axis()
      创建一个新的的坐标轴
  • axis(selection)
       将坐标轴绑定到选择集上,即绘制坐标轴
  • axis.scale([scale])
      给坐标轴设定一个比例尺
  • axis.orlent([orientation])
      设置坐标轴方向,有"left",“bottom”,“right”,“top”;表示垂直坐标轴的方向。

以上就是几个最常用的坐标轴的几个方法,需要熟记这几个方法。

  • axis.ticks()
      设定坐标轴上有几个间隔数,默认为10
  • axis.tickValues([claues])
      设定坐标轴的指定刻度。如,参数为[1,2,5,9],则坐标轴上刻度就显示这几个刻度。

另外还有设置坐标轴内外刻度,刻度格式等方式,因为用的不多,这里就不做阐述了。

特别说明:坐标轴的原始区间为坐标轴的刻度,坐标轴的映射区间为坐标轴的长度。

4、演示坐标系的建立

   var svg = d3.select("body").append("svg")
   			.attr("wigth","600px")
   			.attr("height","600px"); //添加一个svg标签,设置宽高为600px
   var Xscale = d3.scale.linear()
   			.domain([0,10])
   			.range([0,300]); //创建一个用于坐标轴的比例尺
   var Xaxis = d3.svg.axis().scale(Xscale).orient("bottom"); //定义一个刻度方向向下的坐标轴
   var gXaxis = svg.append("g").attr("transform","translate(80,350)"); //添加一个g标签,用于绘制坐标轴
   Xaxis(gXaxis); //绘制坐标轴

上面的完成了一个一个坐标轴的绘制,图片如下:

在这里插入图片描述

我们添加以下的css样式代码并且给添加的g标签添加一个"axis"的class,可以让坐标轴变得好看,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICYRUJFk-1616942846550)(样式x坐标轴.png)]

添加的css样式:

	.axis path,
	.axis line{
		fill:none;
		stroke:black;
		shape-rendering: crispEdges;
	}
	.axis text{
		font-family: sans-serif;
		font-size: 11px;
	}

修改的js行为第8行:

	var gXaxis = svg.append("g").attr("class","axis").attr("transform","translate(80,350)"); //添加一个g标签,用于绘制坐标轴

尾言

  这一个章节是为了给大家介绍坐标轴,因为d3的自由性,所以坐标轴分了3部分,即:比例尺,坐标轴,坐标轴绑定的元素。

  这是一个指北博客,所以内容之突出有用的,不能做为学习资料,但是这个系列博客会成为你学习辅助最好的资料。

  这个系列后天会出一篇应用,用于讲解这个工具怎么使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值