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 相关文章推荐
JS实现两表格里数据来回转移的方法
May 28 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
Mar 03 Javascript
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
Dec 23 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
Dec 27 Javascript
关闭Vue计算属性自带的缓存功能方法
Mar 02 Javascript
微信小程序dom操作的替代思路实例分析
Dec 06 Javascript
详解Vue用cmd创建项目
Feb 12 Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 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
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
2019/04/12 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
JavaScript 异步调用框架 (Part 6 - 实例 &amp; 模式)
2009/08/04 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
JS作用域深度解析
2016/12/29 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
vue如何判断dom的class
2018/04/26 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
原生js实现购物车功能
2020/09/23 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
Python实现的RSS阅读器实例
2015/07/25 Python
如何定义TensorFlow输入节点
2020/01/23 Python
python基于socket函数实现端口扫描
2020/05/28 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
AmazeUI 平滑滚动效果的示例代码
2020/08/20 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
什么是继承
2013/12/07 面试题
幼儿园家长会邀请函
2014/01/15 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
旷课检讨书
2015/01/26 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技