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 写的简单进度条控件
Jan 22 Javascript
不安全的常用的js写法
Sep 15 Javascript
图片在浏览器中底部对齐 解决方法之一
Nov 30 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
Dec 11 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
Jul 20 Javascript
js基础之DOM中document对象的常用属性方法详解
Oct 28 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 Javascript
使用js实现将后台传入的json数据放在前台显示
Aug 06 Javascript
vue移动端项目缓存问题实践记录
Oct 29 Javascript
微信小程序使用 vant Dialog组件的正确方式
Feb 21 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
Jul 15 Javascript
小程序实现上传视频功能
Aug 18 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中处理模拟rewrite 效果
2006/12/09 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
使用PHP实现密保卡功能实现代码<打包下载直接运行>
2011/10/09 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
微信小程序按钮点击动画效果的实现
2019/09/04 Javascript
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python中使用支持向量机(SVM)算法
2017/12/26 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
python实现公司年会抽奖程序
2019/01/22 Python
如何定义TensorFlow输入节点
2020/01/23 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
市场营销专业推荐信
2013/11/03 职场文书
入团者的自我评价分享
2013/12/02 职场文书
党建工作先进材料
2014/05/02 职场文书
学习党代会心得体会
2014/09/05 职场文书
领导干部考核评语
2015/01/04 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
Python创建SQL数据库流程逐步讲解
2022/09/23 Python
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL