d3.js入门教程3-d3.js中的数据操作

d3.js是一个用于绘图的JavaScript库。 它可以可视化展示任何类型的数据。 这篇文章介绍d3.js最常见的数据操作任务,包括排序、过滤、分组、嵌套等。

数学操作

d3.max和d3.min就是获取数据每一列的最大值和最小值的函数,示例代码如下

    <!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
var data = [[1,2,3],[4,5,6]];
// 获取最大值
var max_value = d3.max(data);
// 获取第一列元素最小值
var min_value = d3.min(data, function(d) { return d[0]});
console.log(max_value); // 输出4,5,6
console.log(min_value); // 输出1
</script>

对象和数组

JavaScript的objects对象是被命名值的容器。我们可以用对象元素的名字来调用对象的任何元素,或者调用函数操作任何对象数值。

    <!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
// 1 调用元素
var myObject = { name: "Nicolas", sex: "Male", age: 34 };
console.log(myObject.name); // 输出Nicolas
console.log(myObject["sex"]); // 输出Male // 2 数组操作
var myArray = [12, 34, 23, 12, 89]
console.log(myArray[2]) // 输出23
console.log(myArray[myArray.length - 1]) // 输出最后一个数值89
myArray.pop(); // 删除数组的最后一个元素
console.log(myArray[myArray.length - 1]) // 输出最后一个数值12
myArray.push(34) // 数组末尾添加一个元素
console.log(myArray[myArray.length - 1]) // 输出最后一个数值34
console.log(myArray.indexOf(34)) // 输出数值34第一次出现的位置
</script>

过滤Filtering

d3中的数据过滤方法和常用计算机语言一样

    <!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
var data = ["first", "second", "third", "fourth", "first"]
var result = data.filter(function (d) { return d == "first" }) // 返回包含first的数组
console.log(result) // 输出["first","first"]
result = data.filter(function (d) { return d != "first" }) // 返回不包含first的数组
console.log(result) // 输出["second", "third", "fourth"]
result = data.filter(function (d) { return ["first", "third"].includes(d) }) // 返回包含first和third的数组
console.log(result) // 输出["first","third", "first"]
result = data.filter(function (d) { return !["first", "third"].includes(d) }) // 返回不包含first和third的数组
console.log(result) // 输出["second","fourth"]
var tokeep = ["1", "second", "3"] // 另外一种方法过滤
result = data.filter(function (d) { return tokeep.indexOf(d) >= 0 }) // 返回包含second的数组
console.log(result) // 输出["second"]
result = data.filter(function (d, i) { return i < 2 }) // 返回包含data前两个元素的数组
console.log(result) // 输出["first","second"]
</script>

排序Sorting

d3中的数据排序方法和常用计算机语言一样

    <!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
var data = [0, 3, 2, 4, 1, 2];
var result1 = [0, 3, 2, 4, 1, 2].sort(function (a, b) { return a - b }) // 对data从小到大排序
console.log(result1) // 输出 [0,1,2,2,3,4]
var result2 = data.sort(function (a, b) { return b - a }) // 对data从大到小排序
console.log(result2) // 输出 [4,3,2,2,1]
var result3 = data.sort(function (a, b) { return d3.ascending(a, b) }) // 对data从小到大排序
console.log(result3) // 输出 [0,1,2,2,3,4]
var result4 = data.sort(function (a, b) { return d3.descending(a, b) }) // 对data从大到小排序
console.log(result4) // 输出 [4,3,2,2,1]
dataset = [
{ 'name': "first", 'value': 1 },
{ 'name': "third", 'value': 3 },
{ 'name': "first", 'value': 10 },
{ 'name': "second", 'value': 2 },
]
// 根据dataset中name属性对dataset排序
var result5 = dataset.sort(function (a, b) { return d3.ascending(a.name, b.name); });
console.log(result5)
// 根据dataset中value属性对dataset排序
var result6 = dataset.sort(function (a, b) { return a.value - b.value })
console.log(result6)
</script>

映射group

d3.map可以不改变原数组的情况下创建一个新的数组

<!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
data = [
{ 'name': "first", 'value': 1 },
{ 'name': "third", 'value': 3 },
{ 'name': "first", 'value': 10 },
{ 'name': "second", 'value': 2 },
]
var allGroup = d3.map(data, function (d) { return (d.name) }) // 会去除重复元素
// 输出['first','third','second']
console.log(allGroup.keys()) // d3.map会自动给每个元素加上以索引为key的对象。
console.log(allGroup.values()) // 输出值
</script>

循环loop

<!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
// for循环,输出0到9
var i;
for (i = 0; i < 10; i++) {
console.log(i)
} // 打印列表元素的索引
var allGroup = ["a", "b", "c"];
// 输出是0,1,2不是a,b,c
for (i in allGroup) {
console.log(i)
} // while循环,输出0到9
i = 0;
while (i < 10) {
console.log(i)
i++;
}
</script>

重塑Reshape

有的时候我们需要将数据长表变为宽表,如下图所示。在Python中可以通过pandas中的pivot_table实现,R语言中通过tidyr实现。在js则需要自行编写代码。所以强烈建议在js之外执行数据整理步骤。

我们下面读取csv的数据如下图所示。

    <!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
d3.csv("https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/data_correlogram.csv", function (data) { // Going from wide to long format
var data_long = [];
// 提取每一行数据
data.forEach(function (d) {
// 提取行名
var x = d[""];
// 删除行名
delete d[""];
for (prop in d) {
// 提取列名
var y = prop;
// 提取值
value = d[prop];
data_long.push({
x: x,
y: y,
value: +value
});
}
}); // 展示结果
console.log(data_long)
}); </script>

堆叠Stack

有时我们需要堆叠数据(如第二行数据堆叠在原来第一行数据上展示),特别是对于条形图和面积图,可以通过d3.stack()实现。但是还是推荐数据处理放在js之外执行。下面的代码示例步骤如下图所示。

    <!-- 加载d3 -->
<script src="https://d3js.org/d3.v4.js"></script> <script>
d3.csv("https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/data_stacked.csv", function (data) { // 打印数据
console.log(data) // 从第一列开始提取列名
var subgroups = data.columns.slice(1) // 提取每一行数据
var groups = d3.map(data, function (d) { return (d.group) }).keys() // 堆叠数据
var stackedData = d3.stack()
.keys(subgroups)
(data) // 打印数据
console.log(stackedData) }) </script>

参考

[数据与分析可视化] D3入门教程3-d3中的数据操作的更多相关文章

  1. [数据与分析可视化] D3入门教程2-在d3中构建形状

    d3.js入门教程2-在 d3.js中构建形状 文章目录 d3.js入门教程2-在 d3.js中构建形状 形状的添加 圆形的添加 矩形的添加 线段的添加 文本的添加 折线的添加 区域的添加 圆弧的添加 ...

  2. VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写

    本文转自 http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写 200 ...

  3. testng入门教程16数据驱动(把数据写在xml)

    testng入门教程16数据驱动(把数据写在xml) testng入门教程16数据驱动(把数据写在xml)把数据写在xml文件里面,在xml文件右键选择runas---testng执行 下面是case ...

  4. [数据与分析可视化] D3入门教程1-d3基础知识

    d3.js入门教程1-d3基础知识 文章目录 d3.js入门教程1-d3基础知识 1 HTML介绍 1.1 什么是HTML? 1.2 自定义文档样式CSS 1.3 构建svg图形 2 d3绘图入门 2 ...

  5. Spring Cloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard 和 Turbine

    1. Hystrix Dashboard (断路器:hystrix 仪表盘)  Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboa ...

  6. Wireshark数据包分析(一)——使用入门

    Wireshark简介: Wireshark是一款最流行和强大的开源数据包抓包与分析工具,没有之一.在SecTools安全社区里颇受欢迎,曾一度超越Metasploit.Nessus.Aircrack ...

  7. python数据可视化-matplotlib入门(7)-从网络加载数据及数据可视化的小总结

    除了从文件加载数据,另一个数据源是互联网,互联网每天产生各种不同的数据,可以用各种各样的方式从互联网加载数据. 一.了解 Web API Web 应用编程接口(API)自动请求网站的特定信息,再对这些 ...

  8. Python爬虫入门教程 31-100 36氪(36kr)数据抓取 scrapy

    1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备的,预计在12月底,爬虫大概写到50篇案例的时刻,将会迎来一个新的内容,系统的数 ...

  9. python数据可视化-matplotlib入门(6)-从文件中加载数据

    前几篇都是手动录入或随机函数产生的数据.实际有许多类型的文件,以及许多方法,用它们从文件中提取数据来图形化. 比如之前python基础(12)介绍打开文件的方式,可直接读取文件中的数据,扩大了我们的数 ...

随机推荐

  1. Hive Beeline 命令行参数

    [hadoop@hive ~]$ beeline --help[中文版] The Beeline CLI 支持以下命令行参数: Option Description --autoCommit=[tru ...

  2. MyBatis的各种查询功能

    1.查询一个实体类对象 /** * 根据用户id查询用户信息 * @param id * @return */ User getUserById(@Param("id") int ...

  3. 文本转语音TTS(文本阅读和视频配音制作)MP3

    DL-TTS 通过AI驱动引擎可将文本转化为逼真的语音,它可以:(1)生成逼真的合成语音实现与人声的语调和情感匹配的流畅.发音自然的文本转语音.(2)细化的文本转语音控制支持多种语言,并可调整语速.语 ...

  4. 2.httprunner-yaml用例结构

    前言: httprunner3.x版本弱化了api层的概念 直接在testcase中写request请求 如果是单个请求,也可以直接写成一个testcase 每个testcase必须具有两个类属性:c ...

  5. 【JavaWeb】学习笔记——JSP

    概念 全称:Java Server Pages, Java服务端页面 描述:一种动态的网页技术,可以在其中定义HTML.JS.CSS等静态内容,以及Java代码的动态内容 说明:JSP = HTML ...

  6. 京东云开发者| Redis数据结构(二)-List、Hash、Set及Sorted Set的结构实现

    1 引言 之前介绍了Redis的数据存储及String类型的实现,接下来再来看下List.Hash.Set及Sorted Set的数据结构的实现. 2 List List类型通常被用作异步消息队列.文 ...

  7. 鹅长微服务发现与治理巨作PolarisMesh实践-上

    @ 目录 概述 定义 核心功能 组件和生态 特色亮点 解决哪些问题 官方性能数据 架构原理 资源模型 服务治理 基本原理 服务注册 服务发现 安装 部署架构 集群安装 SpringCloud应用接入 ...

  8. [VUE]报错: No Babel config file detected for

    在使用vue脚手架创建的项目中,项目中每个文件的第一行都会有红色波浪线. 解决方法:在项目文件中找到package.json文件,在parserOptions里添加"requireConfi ...

  9. JS逆向实战8——某网实战(基于golang-colly)

    其实本章算不上逆向教程 只是介绍golang的colly框架而已 列表页分析 根据关键字搜索 通过抓包分析可知 下一页所请求的参数如下 上图标红的代表所需参数 所以其实我们真正需要的也就是Search ...

  10. Python基础之面向对象:3、继承与派生

    面向对象 一.三大特征之继承 python三大特征: 封装.继承.多态 三者中继承最为核心,实际应用对,感受较为直观 封装和多态略微抽象 1.继承的概念 继承的含义: ​ 在现实生活中,继承表示人与人 ...