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. Mapper 实体转换Entiy to Dto

    实际使用中发现很多问题 如果用EFcore 框架,这个表达式树生成一个新的实体导致EFcore 跟踪失败!/// <summary> /// 生成表达式目录树 泛型缓存 /// </ ...

  2. 猫狗识别-CNN与VGG实现

    本次项目首先使用CNN卷积神经网络模型进行训练,最终训练效果不太理想,出现了过拟合的情况.准确率达到0.72,loss达到0.54.使用预训练的VGG模型后,在测试集上准确率达到0.91,取得了不错的 ...

  3. react.js+easyui 做一个简单的商品表

    效果图:     import React from 'react'; import { Form, FormField, Layout,DataList,LayoutPanel,Panel, Lab ...

  4. 20220729 - DP训练 #2

    20220729 - DP训练 #2 时间记录 \(8:00-8:10\) 浏览题面 \(8:10-8:50\) T1 看题想到了建树,从每一个点遍历,若能遍历每一个点,则可以获胜 快速写完之后,发现 ...

  5. Linux实战笔记_CentOS7_yum相关配置

    配置yum源优先级 配置优先级 yum -y install yum-plugin-priorities.noarch vi /etc/yum.repos.d/localISO.repo priori ...

  6. SQL语句编写的练习(MySQL)

    SQL语句编写的练习(MySQL) 一.建表 1.学生表(Student) 学号 | 姓名 | 性别 | 出生年月 | 所在班级 create table Student( sno varchar(2 ...

  7. Django之同时新增数据到两个数据库表与同时返回两个表的数据(插拔式)

    models:比如有以下三个模型 from django.db import models """ 基类,其他类继承即可获得对应的字段 """ ...

  8. 网络工程知识(二)VLAN的基础和配置:802.1q帧;Access、Trunk、Hybrid接口工作模式过程与配置;VLANIF的小实验

    介绍-VLAN VLAN(Virtual Local Area Network)即虚拟局域网,工作在数据链路层. 交换机将通过:接口.MAC.基于子网.协议划分(IPv4和IPv6).基于策略的方式划 ...

  9. golang中的锁竞争问题

    索引:https://www.waterflow.link/articles/1666884810643 当我们打印错误的时候使用锁可能会带来意想不到的结果. 我们看下面的例子: package ma ...

  10. Dapr实现.Net Grpc服务之间的发布和订阅,并采用WebApi类似的事件订阅方式

    大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,总结和整理以前的项目经验,动手写了个洋葱架构(整洁架构)示例解决方案 OnionArch.其目的是为了更好的实现基于DDD(领域驱动分析) ...