共计 1695 个字符,预计需要花费 5 分钟才能阅读完成。
引子
继 Learn D3: By Example 第三篇,只是英文翻译,可批改代码的局部用动态图片代替了,想要实时交互请浏览原文。
- 原文:Learn D3: Data
- 版本:Published Mar 24, 2020
- Origin
- My GitHub
注释
在 Observable 上有多种办法能够获取数据。但因为咱们刚刚开始,让咱们应用最简略的:文件附件。
这个笔记本有一个蕴含每日温度读数的 CSV 文件。我应用 Shift-Command-U ⇧⌘U 键盘快捷键增加它;你还能够通过将文件拖放到文件附件窗格来附加文件,文件附件窗格可通过笔记本菜单或单击下面的回形针图标拜访。
FileAttachment
函数仅返回一个句柄,该句柄容许你抉择所需的示意模式,例如 blob、buffer 或(UTF- 8 编码的)文本。对于 CSV 文件,咱们能够调用 file.text
依照想要的字符串模式获取文件内容。
当然,更有用的办法是将文本解析为具备 date
和 temperature
属性的对象,咱们能够通过将文本传递给 d3.csvParse 来实现。(D3 在上面的附录中加载,在笔记本中的每个单元都可用。)
单击上面的数组查看对象。
尽管 Observable 隐性地期待跨单元的 promises,但咱们必须期待 file.text
promise,因为咱们心愿拜访同一单元中的返回值。
默认状况下,D3 不进行类型推断,因而 date
和 temperature
属性都是字符串。这使得它们很难相处。例如,如果你尝试相加两个温度,将连贯它们。哎呀!😝
要将这些字符串转换为日期和数字,传递一个函数作为第二个参数给 d3.csvParse
。每行调用此函数,依据须要操作行的对象。更好的做法是,通过 d3.autoType 主动推断类型。
如果你查看下面的数组,你将看到蓝色的日期和数字(而不是双引号之间的蓝色字符串),这就表明类型转换胜利。
让咱们略微理解一下 Observable 单元的语法。到目前为止,你只看到了能够命名或匿名的表达式单元。能够查看这两种类型的单元,但只能从其它单元援用已命名的单元。
对于比简略表达式更简单的代码,编写一个块,该块由一个或多个用大括号括起来的语句组成。块单元与函数相似,仅当它们 return 或 yield 时才产生值。和表达式单元一样,命名块单元能够从其它单元援用。
局部变量,例如下面的 s
,对笔记本的其余部分不可见;其它单元只能拜访命名单元的返回值。通过这种形式,Observable 相似于电子表格:每个单元定义一个独特值。
回到手头的工作,在名为 data 的单元中,有更明确的办法来获取、解析和类型转换 CSV 文件。如果你的数据与 d3.autoType 不兼容,你能够采纳这种办法 (如果你不确定,不要依赖主动类型推断或查阅文档。)
有了不便示意的数据,咱们当初能够开始干活了!例如,咱们能够计算日期和温度的范畴,失去区域值。
正如咱们后面看到的,咱们能够在示例直方图中注入数据,便于直观感知温度散布。
温和的气象!啊,旧金山。🌤
在 Observable 解决数据时,一个隐性的思考是将代码放在单个单元还是离开的单元中。一个好的教训法令是,一个单元应该定义一个被其它单元援用的命名值(如下面的 data
),或者它应该向读者显示一些有用信息(如本文、下面的图表或查看单元数据)。
这条规定的一个要害含意是,你应该防止单元之间的隐式依赖关系:只依赖于你能够命名的内容。
为什么?笔记本的数据流是依据其单元援用构建的。如果单元没有名称,则无奈援用该单元,并且隐式依赖其成果的单元可能会在其后面运行。(单元按拓扑程序运行,而不是从上到下。)隐式依赖在开发过程中会导致不确定性的行为😱,以及当笔记本从新加载时可能呈现谬误💥!
例如,如果一个单元定义了一个数组,而另一个单元对其进行了批改,那么其它单元可能会在渐变之前或之后看到该数组。为了防止这种不确定性,须要让依赖关系变的显性,能够为第二个单元指定一个名称并应用 array.from 或 array.map 复制数组。或者合并两个单元,这样其它单元只能看到已批改的数组。
咱们的数据曾经筹备好了,让咱们转向图形!
Next
附录
参考资料
- Learn D3: Data