d3入门篇(三):比例尺坐标轴

这篇文章继承引见d3的基础知识

比例尺

在绘制柱状图时,我们往往会定义很大的画布,但是我们要可视化的数据确很小,这时刻会涌现许多留白
的状况。为了依据显现刻度天真变化宽高,而不是定死,特别是数据差异性很大的时刻,我们愿望图表
显现局限都在画布内里,这时刻就会引入**比例尺**的观点来举行缩放(scale)。

我们在数学里有函数的观点y=f(x),定义域为x(输入)的取值局限,值域为y(输出)的取值局限。输
入x,依据函数划定规矩会输出一个y。

d3中的比例尺与数学中的函数相似,起首我们须要指定函数种别,即比例尺的种别,如scaleLinear,
scalePow, scaleQuantise, scaleOrdinal, scaleSqrt, scaleLog, scaleSequential等等。
然后我们须要给定函数的定义域domain([]),末了须要给定函数的值域range([])。依据这些划定规矩,
d3会为我们返回一个比例尺**函数**。

示例

var linearScale=d3.scaleLinear()
.domain([0,d3.max(dataset,function (d) {
    return d;
})])
.range([0,height]);
//这里linearScale为一个函数,我们可直接实行linearScale(d)

完全示例

import * as d3 from "d3";
var width=300;//svg画布宽
var height=200;//svg画布高
var rectWidth=30;//每一个矩形的默许宽度
var dataset=[45,70,12,79,4,127,33,90];
//定义画布
var svg=d3.select("body")
.append("svg")
.attr("width",width)
.attr("height",height)
.style("background-color","yellow");
//定义比例尺
var linearScale=d3.scaleLinear()
.domain([0,d3.max(dataset,function (d) {
    return d;
})])
.range([0,height]);
//绑定数据集 绘制柱形图
svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("width",rectWidth-2)
.attr("height",function (d,i) {
     return linearScale(d)
})
.attr("x",function (d,i) {
      return rectWidth*i
})
.attr("y",200)
.attr("transform",function (d,i) {
    return `translate(0,${linearScale(-d)})`
})
.attr("fill","blue")

效果
《d3入门篇(三):比例尺坐标轴》
效果显现,数据集被比例尺举行缩放(scale)可视化出来。 d3还供应许多数据处理的要领,max min extent sum median mean shuffle等等。

坐标轴

要定义坐标轴,重要两个步骤:
(1)定义坐标轴的比例尺;
(2)定义坐标轴朝向,刻度;

示例

import * as d3 from "d3";

var width = 300;//svg画布宽
var height = 200;//svg画布高
var dataset = [45, 70, 12, 79, 4, 127, 33, 150];
var testDataset = [4.5, 7.0, 1.2, 7.9, 0.4, 12.7, 3.3, 9.0];
var rectWidth = 30;//每一个矩形的默许宽度
//定义画布
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height)
.style("background-color", "yellow");
//定义矩形比例尺
var linearScale = d3.scaleLinear()
.domain([0, d3.max(dataset, function (d) {
    return d;
})])
.range([0, 200]);

var g = svg.append("g")
.attr("transform", "translate(40,0)");

g.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("width", rectWidth - 2)
.attr("height", function (d, i) {
    return linearScale(d)
})
.attr("x", function (d, i) {
    return rectWidth * i
})
.attr("y", 200)
.attr("transform", function (d, i) {
    return `translate(0,${linearScale(-d)})`
})
.attr("fill", "blue");
//定义坐标轴比例尺
var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset, function (d) {
    return d;
})])
.range([200,0]);
//定义坐标轴
var yAxis = d3.axisLeft(yScale)
.ticks(5);
//挪用坐标轴
g.append("g")
.attr("transform", `translate(0,0)`)
.call(yAxis);

效果

《d3入门篇(三):比例尺坐标轴》
补充知识点

1.“g”标签
g标签是svg的经常使用标签,相当于一个容器标签,把相干元素举行组合。经由过程g标签组合在一起的元素,能够
经由过程g标签设置属性等,举行坐标变更等操纵,如attr("transform","translate()"),举行元素平移;
2.定义坐标轴
    var yAxis = d3.axisLeft(yScale)
    .ticks(5);
起首须要设置坐标轴的朝向,这里是向左,将坐标轴的比例尺作为参数传入axisLeft中;
经由过程ticks设置刻度的数量(不过彷佛并没有什么用途)
3.call()
    g.append("g")
    .attr("transform", `translate(0,0)`)
    .call(yAxis);
yAxis是我们定义的一个坐标轴,实在它本身也是一个函数,将新建的分组<g>传给yAxis()函数,用以绘制,
所以这句代码等价于yAixs (g.append("g") ) ;


    原文作者:winteraq
    原文地址: https://segmentfault.com/a/1190000017375976
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞