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 相关文章推荐
一个简单的javascript类定义例子
Sep 12 Javascript
document.onreadystatechange事件的用法分析
Oct 17 Javascript
JavaScript Object的extend是一个常用的功能
Dec 02 Javascript
JavaScript 滚轮事件使用说明
Mar 07 Javascript
基于jquery实现的文字淡入淡出效果
Nov 14 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
实例讲解JavaScript中的this指向错误解决方法
Jun 13 Javascript
Bootstrap3多级下拉菜单
Feb 24 Javascript
JavaScript正则表达式和级联效果
Sep 14 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 Javascript
浅析Visual Studio Code断点调试Vue
Feb 27 Javascript
微信小程序支付前端源码
Aug 29 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
php之CodeIgniter学习笔记
2013/06/17 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
javascript函数式编程实例分析
2015/04/25 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
js验证账户名是否重复
2020/05/26 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
python中map()与zip()操作方法
2016/02/27 Python
python使用mysql数据库示例代码
2017/05/21 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
详解django自定义中间件处理
2018/11/21 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python多任务之协程的使用详解
2019/08/26 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
LINUX下线程,GDI类的解释
2012/04/17 面试题
应聘自荐书
2013/10/08 职场文书
后勤采购员岗位职责
2013/12/19 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
世界环境日活动总结
2015/02/11 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
小学数学教师研修日志
2015/11/13 职场文书