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 相关文章推荐
用js生产批量批处理执行命令
Jul 28 Javascript
javascript从image转换为base64位编码的String
Jul 29 Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 Javascript
ES6新特征数字、数组、字符串
Oct 01 Javascript
ES6正则的扩展实例详解
Apr 25 Javascript
微信小程序如何获取用户手机号
Jan 26 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
May 23 Javascript
VUE DOM加载后执行自定义事件的方法
Sep 07 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
微信小程序使用蓝牙小插件
Sep 23 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 Javascript
JavaScript实现队列结构过程
Dec 06 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
基于mysql的论坛(4)
2006/10/09 PHP
discuz Passport 通行证 整合笔记
2008/06/30 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
js的各种数据类型判断的介绍
2019/01/19 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
Python如何实现机器人聊天
2020/09/10 Python
历史专业个人求职信分享
2013/12/20 职场文书
工作个人的自我评价
2014/01/14 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
师德学习感言
2014/01/31 职场文书
简历中个人自我评价分享
2014/03/15 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
销售团队获奖感言
2014/08/14 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
导游词之峨眉山
2019/12/16 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle