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 相关文章推荐
你真的了解JavaScript吗?
Feb 24 Javascript
JS动态改变表格边框宽度的方法
Mar 31 Javascript
浅析Node.js 中 Stream API 的使用
Oct 23 Javascript
跟我学习javascript创建对象(类)的8种方法
Nov 20 Javascript
jquery实现全选、反选、获得所有选中的checkbox
Sep 13 Javascript
基于input动态模糊查询的实现方法
Dec 12 Javascript
vue router 跳转后回到顶部的实例
Aug 31 Javascript
3分钟读懂移动端rem使用方法(推荐)
May 06 Javascript
Vue组件实现触底判断
Jun 26 Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 Javascript
JS简单表单验证功能完整示例
Jan 26 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
extjs之去除s.gif的影响
2010/12/25 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
JavaScript实现动态添加,删除行的方法实例详解
2015/07/02 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
Python中的Matplotlib模块入门教程
2015/04/15 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
python操作 hbase 数据的方法
2016/12/18 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
就业协议书的作用
2014/04/11 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
先进典型发言材料
2014/12/30 职场文书
地球上的星星观后感
2015/06/02 职场文书
Python实现天气查询软件
2021/06/07 Python
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS