柱形图是一种最简单的可视化图标,主要有矩形、文字标签、坐标轴组成。

本文为简单起见,只绘制矩形的部分,用以讲解如何使用 D3 在 SVG 画布中绘图。

一、 画布是什么

  前几章的处理对象都是 HTML 的文字,没有涉及图形的制作。

  要绘图,首要需要的是一块绘图的“画布”。

  HTML 5 提供两种强有力的“画布”:SVG 和 Canvas。 

  1.1. SVG 是什么

    SVG,指可缩放矢量图形(Scalable Vector Graphics),是用于描述二维矢量图形的一种图形格式,是由万维网联盟制定的开放标准。

    SVG 使用 XML 格式来定义图形,除了 IE8 之前的版本外,绝大部分浏览器都支持 SVG,可将 SVG 文本直接嵌入 HTML 中显示。

    SVG 有如下特点:

      • SVG 绘制的是矢量图,因此对图像进行放大不会失真。
      • 基于 XML,可以为每个元素添加 JavaScript 事件处理器。
      • 每个图形均视为对象,更改对象的属性,图形也会改变。
      • 不适合游戏应用。

  1.2. Canvas 是什么

    Canvas 是通过 JavaScript 来绘制 2D 图形,是 HTML 5 中新增的元素。

    Canvas 有如下特点:

      • 绘制的是位图,图像放大后会失真。
      • 不支持事件处理器。
      • 能够以 .png 或 .jpg 格式保存图像
      • 适合游戏应用

二、添加画布

  D3 虽然没有明文规定一定要在 SVG 中绘图,但是 D3 提供了众多的 SVG 图形的生成器,它们都是只支持 SVG 的。因此,建议使用 SVG 画布

  使用 D3 在 body 元素中添加 svg 的代码如下。

  1. var width = 300; //画布的宽度
  2. var height = 300; //画布的高度
  3.  
  4. var svg = d3.select("body") //选择文档中的body元素
  5. .append("svg") //添加一个svg元素
  6. .attr("width", width) //设定宽度
  7. .attr("height", height); //设定高度

   有了画布,接下来就可以在画布上作图了。

三、绘制矩形

  绘制一个横向的柱形图。只绘制矩形,不绘制文字和坐标轴。

  在 SVG 中,矩形的元素标签是 rect。例如:

  1. <svg>
  2. <rect></rect>
  3. <rect></rect>
  4. </svg>

  上面的 rect 里没有矩形的属性。矩形的属性,常用的有四个:

    • x:矩形左上角的 x 坐标
    • y:矩形左上角的 y 坐标
    • width:矩形的宽度
    • height:矩形的高度

  要注意,在 SVG 中,x 轴的正方向是水平向右,y 轴的正方向是垂直向下的(设置元素的位置)。

  现在给出一组数据,要对此进行可视化。数据如下:

  1. var dataset = [ 250 , 210 , 170 , 130 , 90 ]; //数据(表示矩形的宽度)

  为简单起见,我们直接用数值的大小来表示矩形的像素宽度(后面会说到这不是一种好方法)。然后,添加以下代码。

  1. var rectHeight = 25; //每个矩形所占的像素高度(包括空白)
  2.  
  3. svg.selectAll("rect")
  4. .data(dataset)
  5. .enter()
  6. .append("rect")
  7. .attr("x",20)
  8. .attr("y",function(d,i){
  9. return i * rectHeight;
  10. })
  11. .attr("width",function(d){
  12. return d;
  13. })
  14. .attr("height",rectHeight-2)
  15. .attr("fill","steelblue");

  这段代码添加了与 dataset 数组的长度相同数量的矩形,所使用的语句是:

  1. svg.selectAll("rect") //选择svg内所有的矩形
  2. .data(dataset) //绑定数组
  3. .enter() //指定选择集的enter部分
  4. .append("rect") //添加足够数量的矩形元素

  这段代码以后会常常出现在 D3 的代码中,请务必牢记。目前不深入讨论它的作用机制是怎样的,只需要读者牢记,当

  有数据,而没有足够图形元素的时候,使用此方法可以添加足够的元素。

  添加了元素之后,就需要分别给各元素的属性赋值。在这里用到了 function(d, i),前面已经讲过,d 代表与当前元素绑定的数据,i 代表索引号。给属性赋值的时候,是需要用到被绑定的数据,以及索引号的。

  最后一行的:

  1. .attr("fill","steelblue");

  是给矩形元素设置颜色。一般来说,最好写成外置 CSS 的形式,方便归类和修改。

D3.js 做一个简单的图表(条形图)的更多相关文章

  1. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  2. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  3. 用JS做一个简单的电商产品放大镜功能

    使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. ...

  4. 用js做一个简单的留言板效果

    html部分: 1: <!DOCTYPE> 2: <html lang="zh-en"> 3: <head> 4: <title>j ...

  5. css3加js做一个简单的3D行星运转效果

    前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...

  6. 用JS,做一个简单的计算器

    <!DOCTYPE html> <html> <head> <meta charset="utf-8">   <title&g ...

  7. 使用React并做一个简单的to-do-list

    1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其virtual ...

  8. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  9. 用 JS 做一个数独游戏(二)

    用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...

随机推荐

  1. LightOj 1197 - Help Hanzo(分段筛选法 求区间素数个数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 题意:给你两个数 a b,求区间 [a, b]内素数的个数, a and b ( ...

  2. Rewrite服务器和robots文件屏蔽动态页面

    Rewrite服务器使用robots文件屏蔽动态页面.

  3. elk实战分析nginx日志文档

    elk实战分析nginx日志文档 架构: kibana <--- es-cluster <--- logstash <--- filebeat 环境准备:192.168.3.1 no ...

  4. ionic获取焦点

    功能需求:点击按钮后获取input输入框的焦点 获取焦点用jq focus()不成功,因为angular也不推荐,所以网上找了一个在focus封装成指令的方法 指令写法: .directive('my ...

  5. [SLAM]Karto SLAM算法学习(草稿)

    Karto_slam算法是一个Graph based SLAM算法.包括前端和后端.关于代码要分成两块内容来看. 一类是OpenKarto项目,是最初的开源代码,包括算法的核心内容: https:// ...

  6. 访问 Android Developers 403 错误

    原因: 以前改过 hosts. 现在用的 威-屁-恩. 解决办法: 把改过的 hosts 删掉就行了.

  7. RDIFramework.NET开发实例━表约束条件权限的使用-Web

    RDIFramework.NET开发实例━表约束条件权限的使用-Web 在上一篇文章“RDIFramework.NET开发实例━表约束条件权限的使用-WinForm”我们讲解了在WinForm下表约束 ...

  8. ubuntu 常用命令集合版(二)【大侠勿喷,菜鸟欢迎】(转)

    原文:http://page.renren.com/600759338/note/729595757 1.shutdown: 关闭系统,如果停留在TTY,请改用halt, poweroff等命令常用参 ...

  9. Latex常用指令学习

    1:\begin{}与\end{}的用法 2:\textcolor{red}{\fangsong\zihao{2}汉字:} 3:\newpage  新的一页 4:\heiti\zihao{4}\bf{ ...

  10. 使用 Google Guava 美化你的 Java 代码

    文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...