d3比例尺scaleLinear和坐标轴的使用

介绍

假如我们在制作柱状图时,不能确定数据的变化范围,或者数据变化过大,就可以使用比例尺。

比例尺,顾名思义,就是把一组数据映射到一个集合中。

具体操作

  • 首先我们先说线性映射,即两个集合都是连续的数

预处理

    	var dataset = [233, 433, 996];
    	var min = d3.min(dataset);//得到最小值
    	var max = d3.max(dataset);//得到最大值
    	var scaleLinear = d3.scaleLinear()
    		.domain([min,max]) // 要被映射的数据范围, 即原始数据
            .range([0, 1000]); // 要被映射到的数据    

映射

scaleLinear(300) //此时这个函数就会直接返回映射后的结果 
  • 此外还有一种非线性映射, 即把两个不是连续的集合之间建立映射关系
<body>
    <script>
    	var index = [0,1,2,3,4];
    	var color = ["刻晴","优菈","甘雨","胡桃","莫娜"];
    	var scaleOrdinal = d3.scaleOrdinal()
    		.domain(index) // 原始数据
    		.range(color); // 要映射到的集合
    	document.write("scaleOrdinal(1)输出:"+scaleOrdinal(1));
    	d3.select("body").append("br");
    	document.write("scaleOrdinal(2)输出:"+scaleOrdinal(2));
    	d3.select("body").append("br");
    	document.write("scaleOrdinal(4)输出:"+scaleOrdinal(4));
    </script>
  </body>

坐标轴

//为坐标轴定义一个线性比例尺
    	var xScale = d3.scaleLinear()
    		.domain([0,d3.max(dataset)])
    		.range([0,250]);
    	//定义一个坐标轴
    	var xAxis = d3.axisBottom(xScale)//定义一个axis,由bottom可知,数字是在坐标轴下方(也就暗示了这是个x轴)
    		.ticks(7);//设置刻度数目
    	g.append("g")
    		.attr("transform","translate("+20+","+(dataset.length*rectHeight)+")")
    		.call(xAxis);

想要换成y轴也很简单,只需把axisBottom换成axisLeft(数字在坐标轴左侧),或者axisRight(数字在坐标轴右侧)

与此同时,想要改变数字递增的方向也很简单,只需把range中两个数字调换一下位置即可。

示例

<body>
<svg></svg>
<script>
    var margin = {top: 80, bottom: 60, left: 70, right: 60};
    var dataset = [21893095,13866009,74610235,34915616,24049155,42591407,24073453,31850088,24870895,84748016,64567588,
        61027171,41540086,45188635,101527453,99365519,57752557,66444864,126012510,10081232,32054159,38562148,83674866,
        47209277,39528999,25019831,5923957,7202654,25823445];
    var datax = ['北京','天津','河北','山西','内蒙古','辽宁','吉林','黑龙江','上海','江苏','浙江','安徽','福建',
        '江西','山东','河南','湖北','湖南','广东','海南','重庆','贵州','四川','云南','陕西','甘肃','青海','宁夏','新疆'];
    var svg = d3.select("svg") // svg画布充斥整个网页
        .attr("width", window.innerWidth)
        .attr("height", window.innerHeight);
    var g = svg.append("g") //设计画布的左上角位置
            .attr("transform", "translate(" + margin.top + "," + margin.left + ")");
    var height = 0.8 * window.innerHeight, width = 0.9 * window.innerWidth; // 用于计算柱状宽度和长度
    var rectWidth = width / dataset.length;
    var scaleLinear = d3.scaleLinear() // 比例尺,把高度作为比例尺的起始数据
        .domain([0, d3.max(dataset)])
        .range([0, height]);
    g.selectAll("rect")
        .data(dataset)
        .enter()
        .append("rect")
        .attr("x", function (d, i) {
            return i * rectWidth;
        })
        .attr("y", function (d, i){//由于高度是从上往下延伸的,所以柱子y轴开始的地方应该是它的顶端
            return height - scaleLinear(d);
        })
        .attr("width", rectWidth * 0.9)
        .attr("height", function (d) {
            return scaleLinear(d);
        })
        .attr("fill", "blue");//颜色
    var yScale = d3.scaleLinear() //添加y轴
        .domain([0, d3.max(dataset)])
        .range([height, 0]); //原本是坐标轴数据从上往下递增的,所以要反着来
    var yAxis = d3.axisLeft(yScale)
        .ticks(10);
    var lineX = 0, lineY = margin.top;
    g.append("g")
        .attr("transform", "translate(" + lineX + "," + 0  + ")")
        .call(yAxis);
</script>
</body>

希望这篇博客对你有所帮助~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在使用d3.js添加柱状图时,我们可以通过以下步骤来添加XY轴坐标: 1. 创建画布:首先,我们需要创建一个SVG画布,并设定合适的宽度和高度,以容纳我们的柱状图和坐标轴。 2. 设定比例尺:根据数据的范围,我们需要设定一个比例尺来将数据映射到坐标轴上。比例尺可以是线性比例尺d3.scaleLinear())或者是序数比例尺d3.scaleOrdinal())。根据需要设定x轴和y轴的比例尺。 3. 创建坐标轴使用d3.axis()函数创建一个坐标轴生成器,并通过指定比例尺和方向来定制坐标轴的样式和刻度。 4. 渲染坐标轴:将坐标轴生成器应用到x和y轴上,并通过translate()函数设置坐标轴的位置。例如,通过将x轴定位在底部,y轴定位在左边。 5. 创建柱状图:使用绑定数据的方式,通过SVG的矩形元素或g元素创建柱状图。可以根据数据的值来设定柱状图的宽度、高度和位置。 6. 添加动画效果(可选):通过使用d3的过渡函数(transition)和延迟函数(delay),可以为柱状图添加动画效果,使其显示变得平滑。 7. 标记坐标轴刻度(可选):可以使用d3的tickFormat函数来设定坐标轴上刻度的显示格式,如千位分隔符等。 通过以上步骤,我们就可以用d3.js添加柱状图并添加XY轴的坐标了。具体实现的代码可以参考d3.js的官方文档或相关教程。 ### 回答2: 在使用d3.js创建柱状图时,我们需要添加x和y轴坐标来帮助展示数据的分布和比较。下面是添加xy轴坐标的步骤: 1. 创建一个svg元素来容纳整个图表。可以使用d3.select方法选择一个div元素,并通过append方法添加一个svg元素。 2. 设置svg元素的宽度和高度,以及padding值,以便给轴线留出足够的空间。 3. 创建一个x轴比例尺。根据柱状图的数据范围和svg的宽度,使用d3.scaleLinear方法创建一个线性比例尺。 4. 创建一个y轴比例尺。根据柱状图的数据范围和svg的高度,使用d3.scaleLinear方法创建一个线性比例尺。 5. 创建一个x轴生成器。使用d3.axisBottom方法创建一个x轴生成器,并传入之前创建的x比例尺。 6. 创建一个y轴生成器。使用d3.axisLeft方法创建一个y轴生成器,并传入之前创建的y比例尺。 7. 将x轴生成器应用到svg元素上的一个g元素上,并通过transform属性将其放置在适当的位置。 8. 将y轴生成器应用到svg元素上的一个g元素上,并通过transform属性将其放置在适当的位置。 9. 如果需要,可以对x轴和y轴进行一些样式设置,比如设置轴线颜色、刻度颜色、文本颜色等。 10. 最后,将柱状图绘制到svg元素上。可以使用d3.select方法选择之前创建的g元素,并通过data和enter方法添加rect元素来表示柱子。可以根据x和y比例尺的返回值来设置每个柱子的位置和高度。 以上就是使用d3.js添加xy轴坐标的基本步骤。根据实际需求和个性化要求,你可以对以上步骤进行进一步的扩展和样式设置。 ### 回答3: 要在d3js中添加柱状图并添加坐标轴,首先需要以下步骤: 1. 创建SVG元素:使用d3.select选择一个HTML元素,然后添加一个SVG元素,设置其宽度和高度。例如: var svg = d3.select("body") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 2. 创建坐标轴比例尺使用d3.scaleBand()创建x轴比例尺使用d3.scaleLinear()创建y轴比例尺。然后设置其域和范围。例如: var x = d3.scaleBand() .range([0, width]) .domain(data.map(function(d) { return d.x; })); var y = d3.scaleLinear() .range([height, 0]) .domain([0, d3.max(data, function(d) { return d.y; })]); 3. 添加柱状图:使用d3.selectAll选择所有柱子的元素,然后使用data()方法将数据绑定到这些元素上。然后使用enter()方法进入上次缺失的元素,并使用append()方法添加矩形元素作为柱子。例如: svg.selectAll(".bar") .data(data) .enter() .append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.x); }) .attr("y", function(d) { return y(d.y); }) .attr("width", x.bandwidth()) .attr("height", function(d) { return height - y(d.y); }); 4. 添加坐标轴使用d3.axisBottom()创建x轴,使用d3.axisLeft()创建y轴。然后使用call()方法将坐标轴添加到SVG元素中。例如: svg.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)); svg.append("g") .call(d3.axisLeft(y)); 以上就是在d3js中添加柱状图并添加坐标轴的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值