D3.js(v3)+react 制作 一个带坐标与比例尺的柱形图 (V3版本)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了D3.js(v3)+react 制作 一个带坐标与比例尺的柱形图 (V3版本),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5715字,纯文字阅读大概需要9分钟。
内容图文
现在用D3.js + react做一个带坐标轴和比例尺的柱形图。我已经尽力把代码全部注释上了,最后我也会把完整柱形图代码奉上。如果还有疑惑的,可以去翻看一下我之前介绍的方法,以下方法都有介绍到。
还有数据都是自己定义的假数据,大家参考一下制作方法即可。
首先定义柱形图的数据、绘图区域的宽高、和上下左右的边距:
1
var width = 600; //SVG绘制区域的宽度2var height = 500; //SVG绘制区域的高度3//定义数据4var dataList = [50,43,120,87,99,167,142]
5//定义上下左右的边距6var padding = {top:20,right:20,bottom:100,left:100}
然后设定SVG:
1
var svg = d3.select("#body") //选择id为body的div2 .append("svg") //在<body>中添加<avg>3 .attr("width",width) //设定<svg>的宽度属性4 .attr("height",height) //设定<svg>的高度属性
定义比例尺:
1
//
定义比例尺
2
//
x轴宽度
3
var xAxisWidth = 300;
4//y轴宽度 5var yAxisWidth = 300;
6 7//x轴比例尺(序数比例尺) 8var xScale = d3.scale.ordinal() //构建一个序数比例尺 9 .domain(d3.range(dataList.length)) //设定定义域10 .rangeRoundBands([0,xAxisWidth],0.2)//代替range()设定值域,并将结果取整11//y轴比例尺(线性比例尺)12var yScale = d3.scale.linear() //创建一个线性比例尺13 .domain([0,d3.max(dataList)]) //设定定义域14 .range([0,yAxisWidth]) //设定值域
然后添加矩形:
1
//
添加矩形
2 svg.selectAll("rect")
3 .data(dataList) //绑定数据 4 .enter() //获取enter部分 5 .append("rect") //添加rect元素,使其与绑定数组的长度一致 6 .attr("fill","fuchsia") //设置颜色 7 .attr("x",function(d,i){ //设置矩形的x坐标 8return padding.left+xScale(i)
9 })
10 .attr("y",function(d){ //设置矩形的y坐标11return height - padding.bottom-yScale(d)
12 })
13 .attr("width",xScale.rangeBand()) //设置矩形的宽度14 .attr("height",function(d){ //设置矩形的高度15return yScale(d)
16 })
然后为矩形添加文字标签:
1
//
为矩形添加标签文字
2 svg.selectAll("text")
3 .data(dataList) //绑定数据 4 .enter() //获取enter部分 5 .append("text") //添加text元素,使其与绑定数组的长度一致 6 .attr("fill","white") //字体颜色 7 .attr("font-size","14px") //字体大小 8 .attr("text-anchor","middle") //文本相对基点的位置 9 .attr("x",function(d,i){ //设置文字的x坐标10return padding.left+xScale(i)
11 })
12 .attr("y",function(d){ //设置文字的y坐标13return height - padding.bottom - yScale(d)
14 })
15 .attr("dx",xScale.rangeBand()/2) //相对于当前位置在x方向上平移的距离
16 .attr("dy","2em") //相对于当前位置在y方向上平移的距离17 .text(function(d){ //文字内容18return d
19 })
最后定义坐标轴:
1
//
定义坐标轴
2
//
x轴
3
var xAxis = d3.svg.axis() //创建一个默认的新坐标轴 4 .scale(xScale) //设定坐标轴的比例尺 5 .orient("bottom") //设定坐标轴的方向 6//重新设置y轴比例尺的值域,与原来的相反 7 yScale.range([yAxisWidth,0])
8//y轴 9var yAxis = d3.svg.axis() //创建一个默认的新坐标轴 10 .scale(yScale) //设定坐标轴的比例尺11 .orient("left") //设定坐标轴的方向1213//添加x轴和平移14 svg.append("g") //在svg中添加一个包含坐标轴各元素的g元素15 .attr("class","axis") //定义class名16 .attr("transform","translate("+padding.left + "," + (height-padding.bottom)+")") //将x轴进行平移17 .call(xAxis) //将自身作为参数传递给xAxis函数18//添加y轴和平移19 svg.append("g") //在svg中添加一个包含坐标轴各元素的g元素20 .attr("class","axis") //定义class名21 .attr("transform","translate("+padding.left+","+(height-padding.bottom-yAxisWidth)+")") //将y轴进行平移22 .call(yAxis) //将自身作为参数传递给yAxis函数
大家看一下效果图:
完整代码:
1 import React, { Component } from ‘react‘;
2 import * as d3 from ‘d3‘; //引入d3 3 4class Bar extends Component {
5 constructor(props) {
6 super(props);
7this.state = {}
8 }
9 10 11 componentDidMount(){ //将方法在componentDidMount生命周期钩子函数中面调用 12this.oneMethod()
13 }
14 15 oneMethod(){
16var width = 600; //SVG绘制区域的宽度 17var height = 500; //SVG绘制区域的高度 18//定义数据 19var dataList = [50,43,120,87,99,167,142]
20//定义上下左右的边距 21var padding = {top:20,right:20,bottom:100,left:100}
22 23var svg = d3.select("#body") //选择id为body的div 24 .append("svg") //在<body>中添加<avg> 25 .attr("width",width) //设定<svg>的宽度属性 26 .attr("height",height) //设定<svg>的高度属性 27 28//定义比例尺 29//x轴宽度 30var xAxisWidth = 300;
31//y轴宽度 32var yAxisWidth = 300;
33 34//x轴比例尺(序数比例尺) 35var xScale = d3.scale.ordinal() //构建一个序数比例尺 36 .domain(d3.range(dataList.length)) //设定定义域 37 .rangeRoundBands([0,xAxisWidth],0.2)//代替range()设定值域,并将结果取整 38//y轴比例尺(线性比例尺) 39var yScale = d3.scale.linear() //创建一个线性比例尺 40 .domain([0,d3.max(dataList)]) //设定定义域 41 .range([0,yAxisWidth]) //设定值域 42 43//添加矩形 44 svg.selectAll("rect")
45 .data(dataList) //绑定数据 46 .enter() //获取enter部分 47 .append("rect") //添加rect元素,使其与绑定数组的长度一致 48 .attr("fill","fuchsia") //设置颜色 49 .attr("x",function(d,i){ //设置矩形的x坐标 50return padding.left+xScale(i)
51 })
52 .attr("y",function(d){ //设置矩形的y坐标 53return height - padding.bottom-yScale(d)
54 })
55 .attr("width",xScale.rangeBand()) //设置矩形的宽度 56 .attr("height",function(d){ //设置矩形的高度 57return yScale(d)
58 })
59 60//为矩形添加标签文字 61 svg.selectAll("text")
62 .data(dataList) //绑定数据 63 .enter() //获取enter部分 64 .append("text") //添加text元素,使其与绑定数组的长度一致 65 .attr("fill","white") //字体颜色 66 .attr("font-size","14px") //字体大小 67 .attr("text-anchor","middle") //文本相对基点的位置 68 .attr("x",function(d,i){ //设置文字的x坐标 69return padding.left+xScale(i)
70 })
71 .attr("y",function(d){ //设置文字的y坐标 72return height - padding.bottom - yScale(d)
73 })
74 .attr("dx",xScale.rangeBand()/2) //相对于当前位置在x方向上平移的距离
75 .attr("dy","2em") //相对于当前位置在y方向上平移的距离 76 .text(function(d){ //文字内容 77return d
78 })
79 80//定义坐标轴 81//x轴 82var xAxis = d3.svg.axis() //创建一个默认的新坐标轴 83 .scale(xScale) //设定坐标轴的比例尺 84 .orient("bottom") //设定坐标轴的方向 85//重新设置y轴比例尺的值域,与原来的相反 86 yScale.range([yAxisWidth,0])
87//y轴 88var yAxis = d3.svg.axis() //创建一个默认的新坐标轴 89 .scale(yScale) //设定坐标轴的比例尺 90 .orient("left") //设定坐标轴的方向 91 92//添加x轴和平移 93 svg.append("g") //在svg中添加一个包含坐标轴各元素的g元素 94 .attr("class","axis") //定义class名 95 .attr("transform","translate("+padding.left + "," + (height-padding.bottom)+")") //将x轴进行平移 96 .call(xAxis) //将自身作为参数传递给xAxis函数 97//添加y轴和平移 98 svg.append("g") //在svg中添加一个包含坐标轴各元素的g元素 99 .attr("class","axis") //定义class名100 .attr("transform","translate("+padding.left+","+(height-padding.bottom-yAxisWidth)+")") //将y轴进行平移101 .call(yAxis) //将自身作为参数传递给yAxis函数102103 }
104105106107 render() {
108return (
109 <div id="body" >
110111 </div>
112 );
113 }
114}
115116 export default Bar;
这样,只带坐标轴和比例尺的柱形图就做完了。后续可以再添加过渡动画效果。
下一章给大家介绍带坐标轴和比例尺的散点图的制作。
原文:https://www.cnblogs.com/littleSpill/p/10835041.html
内容总结
以上是互联网集市为您收集整理的D3.js(v3)+react 制作 一个带坐标与比例尺的柱形图 (V3版本)全部内容,希望文章能够帮你解决D3.js(v3)+react 制作 一个带坐标与比例尺的柱形图 (V3版本)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。