D3.js 系列 (一) D3 简介 + Observable -- D3 在线开发编辑工具简介

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

D3 VS jQuery

刚开始接触 D3,很容易会联想到 jQuery,因为他们在操作元素的语法很相似。网上有这样一个问题:What is the difference between D3 and jQuery?

回答:

  • D3 is data-driven but jQuery is not: with jQuery you directly manipulate elements, but with D3 you provide data and callbacks through D3’s unique data(), enter() and exit() methods and D3 manipulates elements.
  • D3 is usually used for data visualization but jQuery is used for creating web apps. D3 has many data visualization extensions and jQuery has many web app plugins.
  • Both are JavaScript DOM manipulation libraries, have CSS selectors and fluent API and are based on web standards which makes them look similar.

粗译:

  • D3 是数据驱动的,而 jQuery 不是。jQuery 只是操作元素,D3 不仅可以操作元素,还可以使用其特有的 data(), enter() and exit() 方法提供数据和回调。
  • D3 应用于数据可视化,jQuery 应用于网页开发。D3 有很多数据可视化扩展插件,而 jQuery 有很多 web app 插件。
  • 两者都是 DOM 操作类 JS 库,都拥有 CSS 样式选择器和流畅的 API 且建立在 web 标准上,故而有些相似。


1. 这里先提示一个小的 error,也许将来你在开发中也会遇到:

c-error.png

-- Error: Access to XHTMLHttpRequest at 'file/...' from origin 'null' has been blocked by CORS policy. ......

这个问题的出现是因为使用 file 协议打开,而 Chrome 不支持这样访问。

解决方案:本地部署 web

  • 安装 http-server
npm i http-server -g
  • cd 到 index.html 文件的目录下,然后执行命令:
http-server

启动成功会显示如下界面

terminal.png
  • 打开 localhost:8080,可以正常显示了

2. select(), append(), text() 的使用

新建 HTML 文件,引入 d3 库:

<script src="http://d3js.org/d3.v3.min.js"></script>

给个 p 标签

<p>
  This is a test
</p>

然后我们来使用 d3 的 select(), append(), text() 方法:

// 改变 p 元素的文本
d3.select('p').text('test a is this');

// 选中 body 元素追加一个 p 标签并添加文本
d3
  .select('body')
  .append('p')
  .text('this is the second one');

页面显示:

test a is this

this is the second one

3. 画布和常见几何图形

D3 的坐标轴是这样的,坐标轴原点在左上角

d3axes.png
// 新建画布,添加宽度高度,但是画布在网页中是透明的,只有检查元素时可以看到它的大小区域
// 使用 SVG 来作图
var canvas = d3
  .select('body')
  .append('svg')
  .attr('width', 500)
  .attr('height', 500);

// 画圆
var circle = canvas
  .append('circle')
  .attr('cx', 250)
  .attr('cy', 250)
  .attr('r', 50)
  .attr('fill', 'blue');

var circle = canvas
  .append('circle')
  .attr('cx', 250) // 圆心在 X 轴的坐标
  .attr('cy', 250) // 圆心在 Y 轴的坐标
  .attr('r', 5) // 半径
  .attr('fill', '#fff'); // 填充色,如果不写,默认黑色

// 矩形
var rect = canvas
  .append('rect')
  .attr('width', 70)
  .attr('height', 50)
  .attr('fill', 'pink');

// 线,以两个端点固定线的位置,分别是 x1, x2, y1, y2
var line = canvas
  .append('line')
  .attr('x1', 49)
  .attr('y1', 49)
  .attr('x2', 250)
  .attr('y2', 250)
  .attr('stroke', 'green') // 颜色
  .attr('stroke-width', 5); // 粗细

额,画了个啥?
three.png

4. 如何进阶学习

Github 有中文 API 文档,这里只贴出目录供参考,详细信息请查看 API 文档
  • Arrays (静态, 查询, 变换计算, 直方图)
  • Axes 基于比例尺提供人类友好的标尺刻度
  • Brushes 使用鼠标或触摸选择一维或二维区域
  • Chords 和弦图
  • Collections (Objects, Maps, Sets, Nests -- 根据指定的规则将数组重组为层次结构)
  • Colors 颜色空间以及转换
  • Color Schemes 用于定量,序数和分类比例尺的颜色渐变和调色板
  • Contours
  • Dispatches 使用命名回调函数分离关注点
  • Dragging 使用鼠标或触摸输入拖放 SVG, HTML 或者 Canvas
  • Delimiter-Separated Values 解析和格式化以分隔符隔开的特定格式文件或字符串,大多数情况下指 CSV 和 TSV
  • Easings 平滑过渡的过渡函数
  • Fetches 基于 Fetch API 的更为便捷的获取数据方法
  • Forces 使用速度 Verlet 积分的力模型仿真布局
  • Number Formats 对人类友好的数值格式化
  • Geographies 地理投影, 形状以及数学计算(Paths, Projections, Spherical Math, Spherical Shapes, Streams, Transforms)
  • Hierarchies 对层次数据进行可视化的一些布局算法
  • Interpolators 对数值、颜色、字符串、数组、对象等进行插值
  • Paths 将 Canvas 路径命令序列化为 SVG 路径字符串
  • Polygons 二维多边形的几何操作
  • Quadtrees 四叉树, 二维空间递归细分
  • Random Numbers 基于多种多样的分布模型生成随机数
  • Scales 将抽象数据映射到可视化表示的编码(Continuous, Sequential, Quantize, Ordinal)
  • Selections 通过选择元素和绑定数据对 DOM 元素进行修改或变换(Selecting, Modifying, Data, Events, Control, Local Variables, Namespaces)
  • Shapes 可视化基本图元(Arcs 圆形或环形, Pies 饼图或者环形图, Lines 曲线或折线, Areas 面积图, Curves 曲线, Links 圆滑三次 Bézier 曲线, Symbols 分类形状编码, Stacks 堆叠图)
  • Time Formats 受 strptime 和 strftime 启发,时间类型的解析个格式化
  • Time Intervals 按照人类对日期的计算方式实现的日期计算
  • Timers 一个高效的可以用来管理上千并发动画的队列
  • Transitions 对 selections 进行动画过渡
  • Voronoi Diagrams 根据指定的一组点集计算其泰森多边形
  • Zooming 使用触摸鼠标或者触摸面板缩放 SVG, HTML 或者 Canvas
看到这个目录确实有点头痛,更何况每个模块又有分项列表,很多方法。我个人的学习路径是:
  • 略读一遍所有方法名称及其用途
  • 将所有模块按照自己的理解进行分类,因为方法狠多,全部理解并记住不可行亦无必要。将模块再次分类后,做到对 D3 的操作有印象,需要用到的时候知道那个类有哪个方法,再去查阅 API 文档进行开发。
  • 定好目标,不需要太难,自己动手做一个 demo 练习下,这个过程很重要,可以锻炼查阅 API 文档的能力

这里附上我的分类,仅供参考:

分类 模块
⭐️ 计算类 Arrays, Collections, Hierarchies, Polygons, Quadtrees, Random Numbers,
⭐️ 数据处理类 Dispatches, Delimiter-Separated Values, Fetch, Number Formates, Interpolators, Paths
⭐️ 时间处理类 Time Formates, Time Intervals, Timers
⭐️ DOM 操作类 Selections
⭐️ 动画类 Easings, Transitions
👑 颜色类 Color, Color Schemes,
👑 鼠标控制 Brushes, Dragging, Zooming
👑 地理类 Geographies
👑 比例调整类 Axes, Scales,
👑 图形类 Shapes, Voronoi Diagrams, Contours, Forces, Chords
  • 前五项 ⭐️ 分类是属于基础模块,也是平时编程会常用(至少有一部分会常用到)的方法,比如 Arrays, Collections, Fetch... Selection 对应 jQuery, 动画类对应 CSS3. 差不多减少了一半学习量。

  • 后面五个 👑 分类是需要额外学习的了,其中鼠标控制类最简单,图形类最难。

5. 官方画廊

点开 官方画廊 的示例,发现下面的代码根本看不懂

原来 Observable 是一个在线开发编辑 D3 的工具,它的语法同我们平时开发是有些差异的。快速了解 Observable -- 『干货|d3创始人又一力作:不仅能在线写D3.js,还能让你写的更出色 』

另附 Observable: The User Manual 用户使用手册

下一篇文章我会介绍 Observable 使用入门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • Data Visualization with D3 D3: SVG中的jQurey 1. Add Documen...
    王策北阅读 749评论 0 2
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,266评论 0 10
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,280评论 0 23
  • Here is our training plan. Our agenda for this training m...
    FlyingPeter阅读 375评论 0 0
  • 溜溜梅低年级“天天图说”: 时间:3月3日 题目:拔河 小脑袋想一想:什么时间?什么地方?周围的环境怎么样?图上都...
    冰鱼燕阅读 249评论 0 0