d3绘制基本的柱形图的实现代码


Posted in Javascript onDecember 12, 2018

柱形图,是使用柱形的长短来表示数据变化的图表,也是最简单的图表之一。一般情况下,柱形图包括:矩形、坐标轴和文字。

d3简单理解就是通过在svg画布上绘制基本图形,本文将介绍d3绘制基本的柱形图

绘制画布

import * as d3 from "d3";
var width=300;//svg画布宽
var height=200;//svg画布高
//定义画布
var svg=d3.select("body")
  .append("svg")
  .attr("width",width)
  .attr("height",height)
  .style("background-color","yellow")

绘制矩形

var rectWidth=30;//每个矩形的默认宽度
svg.append("rect")
.attr("width",rectWidth-2)
.attr("height",40)
.attr("x",0)
.attr("y",200)
.attr("transform",`translate(0,${-40})`)

svg.append("rect")
.attr("width",rectWidth-2)
.attr("height",20)
.attr("x",rectWidth)
.attr("y",200)
.attr("transform",`translate(0,${-20})`)

结果

d3绘制基本的柱形图的实现代码

总结

1.画布上的坐标轴方向:

  • x轴方向为水平向右;
  • y轴方向为垂直向下;

2.矩形的基本属性:

  • x,y分别对应矩形左上角的坐标轴;
  • width,height分别对应矩形的宽和高;
  • (本示例的数据可视化通过高度来体现)

3.由于默认的y轴方向为垂直向下,所以为了绘制柱形图,我们需要通过attr矩形的transform属性对矩形进行翻转;

4.默认的矩形填充颜色为黑色;

绑定数据

var dataset=[45,70,12,79,4,127,33,90];
svg.selectAll("rect")
.data(dataset)
// .attr("fill","white")
.enter()
.append("rect")
.attr("width",rectWidth-2)
.attr("height",function (d,i) {
   return d
})
.attr("x",function (d,i) {
   return rectWidth*i
})
.attr("y",200)
.attr("transform",function (d,i) {
  return `translate(0,${-d})`
})
.attr("fill","blue")

结果

d3绘制基本的柱形图的实现代码

可以发现前两个矩形的填充颜色和数据并没有发生变化,后面的蓝色矩形为绑定数据后新append的元素;

如果前两个矩形我们不设置高度,是否会通过数据集绑定上相关数据呢?

svg.append("rect")
svg.append("rect")
var dataset=[45,70,12,79,4,127,33,90];
svg.selectAll("rect")
.data(dataset)
// .attr("fill","white")
.enter()
.append("rect")
.attr("width",rectWidth-2)
.attr("height",function (d,i) {
   return d
})
.attr("x",function (d,i) {
   return rectWidth*i
})
.attr("y",200)
.attr("transform",function (d,i) {
  return `translate(0,${-d})`
})
.attr("fill","blue")

结果

d3绘制基本的柱形图的实现代码

结果发现前两个矩形不设置相关属性和值的情况下,也没有和数据集进行绑定,进行相关的可视化工作。

如果我们在绑定数据后立刻attr矩形的属性呢?是否会有所改变呢?

svg.append("rect")
.attr("width",rectWidth-2)
.attr("height",40)
.attr("x",0)
.attr("y",200)
.attr("transform",`translate(0,${-40})`)

svg.append("rect")
.attr("width",rectWidth-2)
.attr("height",20)
.attr("x",rectWidth)
.attr("y",200)
.attr("transform",`translate(0,${-20})`)

var dataset=[45,70,12,79,4,127,33,90];

svg.selectAll("rect")
.data(dataset)
.attr("fill","pink")
.enter()
.append("rect")
.attr("width",rectWidth-2)
.attr("height",function (d,i) {
   return d
})
.attr("x",function (d,i) {
   return rectWidth*i
})
.attr("y",200)
.attr("transform",function (d,i) {
  return `translate(0,${-d})`
})
.attr("fill","blue")

结果

d3绘制基本的柱形图的实现代码

前两个矩形的颜色发生了改变。

现在我们改变一下数据集里面数据的个数,看看会发生什么情况?

var dataset=[45];
//,70,12,79,4,127,33,90
svg.selectAll("rect")
.data(dataset)
.attr("fill","pink")
.enter()
.append("rect")
.attr("width",rectWidth-2)
.attr("height",function (d,i) {
   return d
})
.attr("x",function (d,i) {
   return rectWidth*i
})
.attr("y",200)
.attr("transform",function (d,i) {
  return `translate(0,${-d})`
})
.attr("fill","blue")

结果

d3绘制基本的柱形图的实现代码

我们发现如果数据集里数据的个数只有一个,那么只有第一个矩形的颜色会改变,第二个为默认的黑色。

那么如果在数据集不变的情况下,我们想改变第二个矩形的颜色该怎么做呢?

//这里我们使用exit()
svg.selectAll("rect")
.data(dataset)
.attr("fill","pink")
.exit()
.attr("fill","red")

结果

d3绘制基本的柱形图的实现代码

总结

1.当选择集中已经有了矩形,再进行绑定数据时,数据集中已经存在的矩形的数据不会根据数据集进行更新,会保持不变。

2.当选择集与数据集进行绑定是会出现以下情况:

(1)当选择集中的元素个数 小于 数据集中的元素个数,d3 会为多出来的 data 生成占位符,通过 enter() 处理之后就可以为这些占位符 append 元素。简单理解:enter()后的元素需要继续进行可视化的工作。

(2)当选择集中的元素个数 大于 数据集中的元素个数,通过 exit() 处理之后返回多出来那部分数据的元素选择器(这时候接着执行 append 那就是在 rect 上 append rect 了)。简单理解:exit()后返回的是一个选择集,即多出来的那部分元素。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
extjs 为某个事件设置拦截器
Jan 15 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
Jan 09 Javascript
Javascript基础教程之argument 详解
Jan 18 Javascript
js实现当前输入框高亮显示的方法
Aug 19 Javascript
js淡入淡出的图片轮播效果代码分享
Aug 24 Javascript
JS实现1000以内被3或5整除的数字之和
Feb 18 Javascript
JS获取html元素的标记名实现方法
Oct 08 Javascript
微信小程序 动态绑定事件并实现事件修改样式
Apr 13 Javascript
详解js跨域请求的两种方式,支持post请求
May 05 Javascript
功能完善的小程序日历组件的实现
Mar 31 Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
Feb 08 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
Dec 12 #Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
Dec 12 #Javascript
js使用swiper实现层叠轮播效果实例代码
Dec 12 #Javascript
如何制作一个Node命令行图像识别工具
Dec 12 #Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
Dec 12 #Javascript
ionic使用angularjs表单验证(模板验证)
Dec 12 #Javascript
微信小程序自定义导航教程(兼容各种手机)
Dec 12 #Javascript
You might like
如何给phpadmin一个保护
2006/10/09 PHP
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
php常用Output和ptions/Info函数集介绍
2013/06/19 PHP
php浏览历史记录的方法
2015/03/10 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
ES6基础之数组和对象的拓展实例详解
2019/08/22 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python实现队列的方法
2015/05/26 Python
Python 模拟购物车的实例讲解
2017/09/11 Python
python实现八大排序算法(2)
2017/09/14 Python
python使用jieba实现中文分词去停用词方法示例
2018/03/11 Python
浅谈Pycharm调用同级目录下的py脚本bug
2018/12/03 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
初三化学教学反思
2014/01/23 职场文书
关于保护环境的建议书
2014/08/26 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
教师先进个人材料
2014/12/17 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL