D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)


Posted in Javascript onMay 09, 2019

上篇文章给大家介绍了圆柱图:https://3water.com/article/160958.htm

散点图(Scatter Chart),通常是一横一竖两个坐标轴,数据是一组二维坐标,分别对应两个坐标轴,与坐标轴对应的地方打上点。由此可以猜到,需要的元素包括circle(圆)和axis(坐标轴)。需要进行可视化的数据有:

//圆心数据
 var center = [
 [0.5,0.5],[0.7,0.8],[0.4,0.9],
 [0.11,0.32],[0.88,0.25],[0.75,0.12],
 [0.5,0.1],[0.2,0.3],[0.4,0.1],[0.6,0.7]
 ]

然后定义一个SVG的绘制区域:

//定义一个svg的绘制区域。
 var width = 600; //svg绘制区域的宽度
 var height = 500; //svg绘制区域的高度

 var svg = d3.select("#body")  //选择id为body的div
  .append("svg")  //在<body>中添加<avg>
  .attr("width",width) //设定<svg>的宽度属性
  .attr("height",height) //设定<svg>的高度属性

数组中的每一项都是一个数组,子数组的第一项表示x值,第二项表示y值。实际应用中x轴和y轴可能对应着不同的意义,单位也可能不同。比如人口-GDP、烟龄-肺癌率等。这些数据都不可能直接用像素作单位来绘制,因为类似(0.5,0.5)、(0.7,0.8)这样的位置,即便绘制了也会看到圆都挤到一块,分不清彼此。因此要先使用比例尺将它们放大。

//定义比例尺
 //x轴宽度
 var xAxisWidth = 300;
 //y轴宽度
 var yAxisWidth = 300;
 //x轴比例尺
 var xScale = d3.scale.linear()  //创建一个线性比例尺
  .domain([0,1.2*d3.max(center,function(d){ //设定定义域
  return d[0]
  })])
  .range([0,xAxisWidth])  //设定值域
 //y轴比例尺
 var yScale = d3.scale.linear()  //创建一个线性比例尺
  .domain([0,1.2*d3.max(center,function(d){ //设定定义域
  return d[1]
  })])
  .range([0,yAxisWidth])  //设定值域

 xAxisWidth和yAxisWidth可以根据需求设定。要注意,两个比例尺都是线性比例尺,在设定定义域domain时,使用了d3.max(),这是一个求数组最大值的函数。详情见https://3water.com/article/160968.htm对于x轴的比例尺来说,这里的意思是,相对于center数组的每一项,返回其子数组的第一项(d[0])组成一个新的数组,然后再求最大值。最大值前面乘了一个1.2,这是为了使得散点图不会有某一点存在于坐标轴的边缘上。 

下面在SVG中绘制图形,先绘制圆: 

//在svg中绘制图形,先绘制圆
 //外边框
 var padding = {top:30,right:30,bottom:100,left:100};
 //绘制圆
 var circle = svg.selectAll("circle")
  .data(center)  //绑定数据
  .enter()  //获取enter部分
  .append("circle") //
  
  .attr("fill","goldEnrod") //设置颜色
  .attr("cx",function(d){ //设置圆心的x坐标
  return padding.left + xScale(d[0])
  })
  .attr("cy",function(d){ //设置圆心的y坐标
  return height-padding.bottom-yScale(d[1])
  })
  .attr("r",5)  //设置圆的半径

注意上面代码的粗体字部分,分别使用x轴和y轴的比例尺放大数据。 

最后定义坐标轴: 

 

//定义坐标轴
 //x轴
 var xAxis = d3.svg.axis()  //创建一个默认的新坐标轴
  .scale(xScale)  //设定坐标轴的比例尺
  .orient("bottom") //设定坐标轴的方向

 
 yScale.range([yAxisWidth,0])  //重新设置y轴比例尺的值域,与原来的相反

 //y轴
 var yAxis = d3.svg.axis()  //创建一个默认的新坐标轴
  .scale(yScale)  //设定坐标轴的比例尺
  .orient("left")  //设定坐标轴的方向

 //添加x轴和平移
 svg.append("g")   //在svg中添加一个包含坐标轴各元素的g元素
 .attr("class","axis")  //定义class名
 .attr("transform","translate("+padding.left+","+(height-padding.bottom)+")") //将x轴进行平移
 .call(xAxis)  //将自身作为参数传递给xAxis函数
 
 //设置y轴和平移
 svg.append("g")   //在svg中添加一个包含坐标轴各元素的g元素
 .attr("class","axis")  //定义class名
 .attr("transform","translate("+padding.left+","+(height-padding.bottom-yAxisWidth+")")) //将y轴进行平移
 .call(yAxis)

看一下效果图:

 D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)

完整代码:

import React, { Component } from 'react';
import * as d3 from 'd3'
class ScatterChart extends Component {
 constructor(props) {
 super(props);
 this.state = {}
 }
 componentDidMount(){
 this.oneMethod()
 }
 oneMethod(){
 //圆心数据
 var center = [
 [0.5,0.5],[0.7,0.8],[0.4,0.9],
 [0.11,0.32],[0.88,0.25],[0.75,0.12],
 [0.5,0.1],[0.2,0.3],[0.4,0.1],[0.6,0.7]
 ]
 //定义一个svg的绘制区域。
 var width = 600; //svg绘制区域的宽度
 var height = 500; //svg绘制区域的高度
 var svg = d3.select("#body")  //选择id为body的div
  .append("svg")  //在<body>中添加<avg>
  .attr("width",width) //设定<svg>的宽度属性
  .attr("height",height) //设定<svg>的高度属性
 //定义比例尺
 //x轴宽度
 var xAxisWidth = 300;
 //y轴宽度
 var yAxisWidth = 300;
 //x轴比例尺
 var xScale = d3.scale.linear()  //创建一个线性比例尺
  .domain([0,1.2*d3.max(center,function(d){ //设定定义域
  return d[0]
  })])
  .range([0,xAxisWidth])  //设定值域
 //y轴比例尺
 var yScale = d3.scale.linear()  //创建一个线性比例尺
  .domain([0,1.2*d3.max(center,function(d){ //设定定义域
  return d[1]
  })])
  .range([0,yAxisWidth])  //设定值域
 //在svg中绘制图形,先绘制圆
 //外边框
 var padding = {top:30,right:30,bottom:100,left:100};
 //绘制圆
 var circle = svg.selectAll("circle")
  .data(center)  //绑定数据
  .enter()  //获取enter部分
  .append("circle") //
  .attr("fill","goldEnrod") //设置颜色
  .attr("cx",function(d){ //设置圆心的x坐标
  return padding.left + xScale(d[0])
  })
  .attr("cy",function(d){ //设置圆心的y坐标
  return height-padding.bottom-yScale(d[1])
  })
  .attr("r",5)  //设置圆的半径
 //定义坐标轴
 //x轴
 var xAxis = d3.svg.axis()  //创建一个默认的新坐标轴
  .scale(xScale)  //设定坐标轴的比例尺
  .orient("bottom") //设定坐标轴的方向
 yScale.range([yAxisWidth,0])  //重新设置y轴比例尺的值域,与原来的相反
 //y轴
 var yAxis = d3.svg.axis()  //创建一个默认的新坐标轴
  .scale(yScale)  //设定坐标轴的比例尺
  .orient("left")  //设定坐标轴的方向
 //添加x轴和平移
 svg.append("g")   //在svg中添加一个包含坐标轴各元素的g元素
 .attr("class","axis")  //定义class名
 .attr("transform","translate("+padding.left+","+(height-padding.bottom)+")") //将x轴进行平移
 .call(xAxis)  //将自身作为参数传递给xAxis函数
 //设置y轴和平移
 svg.append("g")   //在svg中添加一个包含坐标轴各元素的g元素
 .attr("class","axis")  //定义class名
 .attr("transform","translate("+padding.left+","+(height-padding.bottom-yAxisWidth+")")) //将y轴进行平移
 .call(yAxis)  //将自身作为参数传递给yAxis函数
 }
 render() {
 return (
 <div id="body" >
 </div>
 );
 }
}
export default ScatterChart;

总结

以上所述是小编给大家介绍的D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本) ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
Mar 28 Javascript
jquery validate poshytip 自定义样式
Nov 26 Javascript
Javascript基础教程之while语句
Jan 18 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
jQuery实现右键菜单、遮罩等效果代码
Sep 27 Javascript
windows下vue-cli及webpack搭建安装环境
Apr 25 Javascript
记录一篇关于redux-saga的基本使用过程
Aug 18 Javascript
从零开始学习搭建React脚手架项目
Aug 23 Javascript
vue 使用vue-i18n做全局中英文切换的方法
Oct 29 Javascript
如何让node运行es6模块文件及其原理详解
Dec 11 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 #Javascript
vue 引用自定义ttf、otf、在线字体的方法
May 09 #Javascript
bootstrap-table formatter 使用vue组件的方法
May 09 #Javascript
详解es6新增数组方法简便了哪些操作
May 09 #Javascript
Vue函数式组件-你值得拥有
May 09 #Javascript
12个提高JavaScript技能的概念(小结)
May 09 #Javascript
Vue 处理表单input单行文本框的实例代码
May 09 #Javascript
You might like
php去除HTML标签实例
2013/11/06 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
[53:15]Mineski vs iG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
序列化Python对象的方法
2020/08/01 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
法学函授自我鉴定
2014/02/06 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
社区义诊活动总结
2014/04/30 职场文书
大学迎新标语
2014/06/26 职场文书
佛光寺导游词
2015/02/10 职场文书
教师求职简历自我评价
2015/03/10 职场文书
总账会计岗位职责
2015/04/02 职场文书
校运会新闻稿
2015/07/17 职场文书
早上好问候语大全
2015/11/10 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP