D3.js - 快速指南


D3.js - 简介

数据可视化是以图形或图形格式呈现数据。数据可视化的主要目标是通过统计图形、图表和信息图形清晰有效地传达信息。

数据可视化帮助我们快速有效地传达我们的见解。由可视化表示的任何类型的数据都允许用户比较数据、生成分析报告、理解模式,从而帮助他们做出决策。数据可视化可以是交互式的,以便用户分析图表中的特定数据。那么,数据可视化可以使用不同的 JavaScript 框架开发并集成到常规网站甚至移动应用程序中。

什么是 D3.js?

D3.js 是一个 JavaScript 库,用于在浏览器中创建交互式可视化效果。D3.js 库允许我们在数据集的上下文中操作网页的元素。这些元素可以是HTML、SVGCanvas 元素,并且可以根据数据集的内容引入、删除或编辑。它是一个用于操作 DOM 对象的库。D3.js 可以为数据探索提供宝贵的帮助,它使您能够控制数据的表示并允许您添加交互性。

为什么我们需要 D3.js?

与其他库相比,D3.js 是首要框架之一。这是因为它可以在网络上运行,并且其数据可视化效果非常出色。它如此有效的另一个原因是它的灵活性。由于它与现有 Web 技术无缝协作,并且可以操作文档对象模型的任何部分,因此它与客户端 Web 技术堆栈(HTML、CSS 和 SVG)一样灵活。它拥有强大的社区支持并且更容易学习。

D3.js 特点

D3.js 是最好的数据可视化框架之一,它可用于生成简单和复杂的可视化以及用户交互和过渡效果。下面列出了它的一些显着特征 -

  • 极其灵活。
  • 易于使用且快速。
  • 支持大型数据集。
  • 声明式编程。
  • 代码可重用性。
  • 具有多种曲线生成功能。
  • 将数据与 html 页面中的一个元素或一组元素相关联。

D3.js 的好处

D3.js 是一个开源项目,无需任何插件即可运行。它需要的代码非常少,并具有以下优点 -

  • 出色的数据可视化。

  • 它是模块化的。您可以下载一小段您想要使用的 D3.js。无需每次都加载整个库。

  • 轻松构建图表组件。

  • DOM 操作。

在下一章中,我们将了解如何在我们的系统上安装 D3.js。

D3.js - 安装

在本章中,我们将学习如何设置D3.js开发环境。在开始之前,我们需要以下组件 -

  • D3.js 库
  • 编辑
  • 网页浏览器
  • 网络服务器

让我们一一详细地了解这些步骤。

D3.js 库

我们需要将 D3.js 库包含到您的 HTML 网页中,以便使用 D3.js 创建数据可视化。我们可以通过以下两种方式做到这一点 -

  • 包含项目文件夹中的 D3.js 库。
  • 包含来自 CDN(内容分发网络)的 D3.js 库。

下载 D3.js 库

D3.js 是一个开源库,该库的源代码可在https://d3js.org/网站上免费获取。访问 D3.js 网站并下载最新版本的 D3.js (d3.zip)。截至目前,最新版本为4.6.0。

下载完成后,解压文件并查找d3.min.js。这是 D3.js 源代码的缩小版本。复制 d3.min.js 文件并将其粘贴到项目的根文件夹或任何其他要保存所有库文件的文件夹中。将 d3.min.js 文件包含在您的 HTML 页面中,如下所示。

示例- 让我们考虑以下示例。

<!DOCTYPE html>
<html lang = "en">
   <head>
      <script src = "/path/to/d3.min.js"></script>
   </head>

   <body>
      <script>
         // write your d3 code here.. 
      </script>
   </body>
</html>

D3.js 是 JavaScript 代码,因此我们应该将所有 D3 代码编写在“script”标签内。我们可能需要操作现有的 DOM 元素,因此建议将 D3 代码编写在“body”标签末尾之前。

包含来自 CDN 的 D3 库

我们可以通过将 D3.js 库从内容分发网络 (CDN) 直接链接到我们的 HTML 页面来使用它。CDN 是一个服务器网络,文件在其中托管并根据用户的地理位置传送给用户。如果我们使用CDN,则不需要下载源代码。

使用 CDN URL https://d3js.org/d3.v4.min.js将 D3.js 库包含到我们的页面中,如下所示。

示例- 让我们考虑以下示例。

<!DOCTYPE html>
<html lang = "en">
   <head>
      <script src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <script>
         // write your d3 code here.. 
      </script>
   </body>
</html>

D3.js 编辑器

我们需要一个编辑器来开始编写您的代码。有一些很棒的 IDE(集成开发环境)支持 JavaScript,例如:

  • 视觉工作室代码
  • 网络风暴
  • 崇高的文字

这些 IDE 提供智能代码完成功能并支持一些现代 JavaScript 框架。如果您没有精美的 IDE,您始终可以使用基本的编辑器,如记事本、VI 等。

网页浏览器

D3.js 适用于除 IE8 及更低版本之外的所有浏览器。

网络服务器

大多数浏览器直接从本地文件系统提供本地 HTML 文件。但是,加载外部数据文件时存在某些限制。在本教程的后面几章中,我们将从CSVJSON等外部文件加载数据。因此,如果我们从一开始就设置 Web 服务器,对我们来说会更容易。

您可以使用任何您熟悉的 Web 服务器,例如 IIS、Apache 等。

查看您的页面

在大多数情况下,我们只需在网络浏览器中打开您的 HTML 文件即可查看。但是,在加载外部数据源时,运行本地 Web 服务器并从服务器查看页面(http://localhost:8080)更为可靠。

D3.js - 概念

D3.js 是一个开源 JavaScript 库 -

  • 文档对象模型 (DOM) 的数据驱动操作。
  • 处理数据和形状。
  • 为线性、分层、网络和地理数据布置视觉元素。
  • 实现用户界面 (UI) 状态之间的平滑过渡。
  • 实现有效的用户交互。

网络标准

在开始使用 D3.js 创建可视化之前,我们需要熟悉 Web 标准。D3.js 中大量使用以下 Web 标准。

  • 超文本标记语言 (HTML)
  • 文档对象模型 (DOM)
  • 层叠样式表 (CSS)
  • 可缩放矢量图形 (SVG)
  • JavaScript

让我们一一详细了解这些 Web 标准。

超文本标记语言 (HTML)

众所周知,HTML 用于构建网页内容。它存储在扩展名为“.html”的文本文件中。

示例- 一个典型的简单 HTML 示例如下所示

<!DOCTYPE html>
<html lang = "en">
   <head>
      <meta charset = "UTF-8">
      <title></title>
   </head>

   <body>
   </body>
</html>

文档对象模型 (DOM)

当浏览器加载 HTML 页面时,它会转换为分层结构。HTML 中的每个标签都会转换为具有父子层次结构的 DOM 中的元素/对象。它使我们的 HTML 更具逻辑结构。一旦 DOM 形成,操作(添加/修改/删除)页面上的元素就变得更加容易。

让我们使用以下 HTML 文档来理解 DOM -

<!DOCTYPE html>
<html lang = "en">
   <head>
      <title>My Document</title>
   </head>

   <body>
      <div>
         <h1>Greeting</h1>
         <p>Hello World!</p>
      </div>
   </body>
</html>

上述HTML文档的文档对象模型如下,

文档对象模型

层叠样式表 (CSS)

HTML 为网页提供了结构,而 CSS 样式则使网页看起来更美观。CSS 是一种样式表语言,用于描述以 HTML 或 XML(包括 SVG 或 XHTML 等 XML 方言)编写的文档的呈现方式。CSS 描述了元素如何在网页上呈现。

可缩放矢量图形 (SVG)

SVG 是一种在网页上渲染图像的方法。SVG 不是直接图像,而只是使用文本创建图像的一种方式。顾名思义,它是一个可伸缩向量。它会根据浏览器的大小自行缩放,因此调整浏览器的大小不会使图像变形。除 IE 8 及以下版本外,所有浏览器都支持 SVG。数据可视化是视觉表示,使用 D3.js 使用 SVG 来渲染可视化非常方便。

将 SVG 视为一块画布,我们可以在上面绘制不同的形状。首先,让我们创建一个 SVG 标签 -

<svg width = "500" height = "500"></<svg>

SVG 的默认测量单位是像素,因此我们不需要指定单位是否为像素。现在,如果我们想绘制一个矩形,我们可以使用下面的代码来绘制它 -

<svg width = "500" height = "500">
   <rect x = "0" y = "0" width = "300" height = "200"></rect>
</svg>

我们可以在 SVG 中绘制其他形状,例如直线、圆形、椭圆形、文本和路径。

就像 HTML 元素的样式一样,SVG 元素的样式也很简单。让我们将矩形的背景颜色设置为黄色。为此,我们需要添加一个属性“fill”并将值指定为黄色,如下所示 -

<svg width = "500" height = "500">
   <rect x = "0" y = "0" width = "300" height = "200" fill = "yellow"></rect>
</svg>

JavaScript

JavaScript 是一种松散类型的客户端脚本语言,在用户的浏览器中执行。JavaScript 与 HTML 元素(DOM 元素)交互,以使 Web 用户界面具有交互性。JavaScript 实现ECMAScript 标准,其中包括基于 ECMA-262 规范的核心功能以及不基于 ECMAScript 标准的其他功能。JavaScript 知识是 D3.js 的先决条件。

D3.js - 选择

选择是 D3.js 中的核心概念之一。它基于 CSS 选择器。它允许我们选择网页中的一个或多个元素。此外,它允许我们修改、追加或删除与预定义数据集相关的元素。在本章中,我们将了解如何使用选择来创建数据可视化。

D3.js 有助于使用以下两种方法从 HTML 页面中选择元素 -

  • select() - 通过匹配给定的 CSS 选择器仅选择一个 DOM 元素。如果给定 CSS 选择器有多个元素,则它仅选择第一个元素。

  • selectAll() - 通过匹配给定的 CSS 选择器来选择所有 DOM 元素。如果您熟悉使用 jQuery 选择元素,D3.js 选择器几乎是相同的。

让我们详细介绍一下每种方法。

select() 方法

select() 方法根据 CSS 选择器选择 HTML 元素。在 CSS 选择器中,您可以通过以下三种方式定义和访问 HTML 元素 -

  • HTML 元素的标签(例如 div、h1、p、span 等)
  • HTML 元素的类名
  • HTML 元素的 ID

让我们通过示例来看看它的实际效果。

按标签选择

您可以使用其标签来选择 HTML 元素。以下语法用于选择“div”标签元素,

d3.select(“div”)

示例- 创建页面“select_by_tag.html”并添加以下更改,

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div>
         Hello World!    
      </div>
      
      <script>
         d3.select("div").text();
      </script>
   </body>
</html>

通过浏览器请求网页,您将在屏幕上看到以下输出 -

按类别名称选择

可以使用以下语法选择使用 CSS 类设置样式的 HTML 元素。

d3.select(“.<class name>”)

创建一个网页“select_by_class.html”并添加以下更改 -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div class = "myclass">
         Hello World!
      </div>
      
      <script>
         ad3.select(".myclass").text();
      </script>
   </body>
</html>

通过浏览器请求网页,您将在屏幕上看到以下输出 -

按ID选择

HTML 页面中的每个元素都应该有一个唯一的 ID。我们可以使用元素的唯一 ID 来使用 select() 方法来访问它,如下所示。

d3.select(“#<id of an element>”)

创建一个网页“select_by_id.html”并添加以下更改。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div id = "hello">
         Hello World!
      </div>
      
      <script>
         d3.select("#hello").text();
      </script>
   </body>
</html>

通过浏览器请求网页,您将在屏幕上看到以下输出。

添加 DOM 元素

D3.js 选择提供了append()text()方法来将新元素附加到现有的HTML 文档中。本节详细介绍如何添加 DOM 元素。

append() 方法

append() 方法将一个新元素追加为当前选择中该元素的最后一个子元素。该方法还可以修改元素的样式、属性、属性、HTML 和文本内容。

创建一个网页“select_and_append.html”并添加以下更改 -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div class = "myclass">
         Hello World!
      </div>
      
      <script>
         d3.select("div.myclass").append("span");
      </script>
   </body>
</html>

通过浏览器请求网页,您可以在屏幕上看到以下输出:

这里,append() 方法在 div 标签内添加一个新的标签范围,如​​下所示 -

<div class = "myclass">
   Hello World!<span></span>
</div>

text() 方法

text() 方法用于设置所选/附加元素的内容。让我们更改上面的示例并添加 text() 方法,如下所示。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div class = "myclass">
         Hello World!
      </div>
      
      <script>
         d3.select("div.myclass").append("span").text("from D3.js");
      </script>
   </body>
</html>

现在刷新网页,您将看到以下响应。

这里,上面的脚本执行链接操作。D3.js 巧妙地采用了一种称为链式语法的技术,您可能会从jQuery中认识到这种技术。通过将方法与句点链接在一起,您可以在一行代码中执行多个操作。它既快速又简单。同样的脚本也可以在没有链式语法的情况下进行访问,如下所示。

var body = d3.select("div.myclass");
var span = body.append("span");
span.text("from D3.js");

修改元素

D3.js提供了多种方法,html()、attr()style()来修改所选元素的内容和样式。让我们看看本章中如何使用修改方法。

html() 方法

html() 方法用于设置所选/附加元素的 html 内容。

创建一个网页“select_and_add_html.html”并添加以下代码。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div class = "myclass">
         Hello World!
      </div>
      
      <script>
         d3.select(".myclass").html("Hello World! <span>from D3.js</span>");
      </script>
   </body>
</html>

通过浏览器请求网页,您将在屏幕上看到以下输出。

attr() 方法

attr() 方法用于添加或更新所选元素的属性。创建一个网页“select_and_modify.html”并添加以下代码。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div class = "myclass">
         Hello World!
      </div>
      
      <script>
         d3.select(".myclass").attr("style", "color: red");
      </script>
   </body>
</html>

通过浏览器请求网页,您将在屏幕上看到以下输出。

style() 方法

style() 方法用于设置所选元素的样式属性。创建一个网页“select_and_style.html”并添加以下代码。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div class = "myclass">
         Hello World!
      </div>
      
      <script>
         d3.select(".myclass").style("color", "red");
      </script>
   </body>
</html>

通过浏览器请求网页,您将在屏幕上看到以下输出。

classed() 方法

classed() 方法专门用于设置 HTML 元素的“class”属性。因为,单个 HTML 元素可以有多个类;将类分配给 HTML 元素时我们需要小心。该方法知道如何处理一个元素上的一个或多个类,并且它是高性能的。

  • 添加类- 要添加类,分类方法的第二个参数必须设置为 true。它的定义如下 -

d3.select(".myclass").classed("myanotherclass", true);
  • 删除类- 要删除类,分类方法的第二个参数必须设置为 false。它的定义如下 -

d3.select(".myclass").classed("myanotherclass", false);
  • 检查类- 要检查类是否存在,只需省略第二个参数并传递您正在查询的类名称。如果存在则返回 true,如果不存在则返回 false。

d3.select(".myclass").classed("myanotherclass");

如果选择中的任何元素具有该类,则这将返回 true。使用d3.select进行单个元素选择。

  • 切换类- 将类翻转到相反的状态 - 如果已存在则将其删除,如果尚不存在则添加它 - 您可以执行以下操作之一。

    对于单个元素,代码可能如下所示 -

var element = d3.select(".myclass")
element.classed("myanotherclass", !oneBar.classed("myanotherclass"));

selectAll() 方法

selectAll() 方法用于选择 HTML 文档中的多个元素。select 方法选择第一个元素,但 selectAll 方法选择与特定选择器字符串匹配的所有元素。如果选择不匹配,则返回空选择。我们也可以在 selectAll() 方法中链接所有附加修改方法,append()、html()、text()、attr()、style()、classed()等。在这种情况下,这些方法将影响所有匹配的元素。让我们通过创建一个新网页“select_multiple.html”并添加以下脚本来理解 -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <h2 class = "myclass">Message</h2>
      <div class = "myclass">
         Hello World!
      </div>
      
      <script>
         d3.selectAll(".myclass").attr("style", "color: red");
      </script>
   </body>
</html>

通过浏览器请求网页,您将在屏幕上看到以下输出。

这里,attr()方法适用于divh2标签,并且两个标签中的文本颜色都更改为红色。

D3.js - 数据连接

数据连接是 D3.js 中的另一个重要概念。它与选择一起工作,使我们能够根据我们的数据集(一系列数值)操作 HTML 文档。默认情况下,D3.js 在其方法中赋予数据集最高优先级,数据集中的每个项目对应一个 HTML 元素。本章详细介绍了数据连接。

什么是数据连接?

数据连接使我们能够根据现有 HTML 文档中的数据集注入、修改和删除元素(HTML 元素以及嵌入的 SVG 元素)。默认情况下,数据集中的每个数据项对应于文档中的一个元素(图形)。

当数据集发生变化时,也可以轻松操作相应的元素。数据连接在我们的数据和文档的图形元素之间创建了紧密的关系。数据连接使得基于数据集的元素操作变得非常简单和容易。

数据连接如何工作?

数据联接的主要目的是将现有文档的元素与给定的数据集进行映射。它根据给定的数据集创建文档的虚拟表示,并提供使用该虚拟表示的方法。让我们考虑一个简单的数据集,如下所示。

[10, 20, 30, 25, 15]

该数据集有五个项目,因此可以映射到文档的五个元素。让我们使用选择器的 selectAll() 方法和数据连接的 data() 方法将其映射到以下文档的li元素。

超文本标记语言

<ul id = "list">
   <li><li>
   <li></li>
</ul> 

D3.js代码

d3.select("#list").selectAll("li").data([10, 20, 30, 25, 15]);

现在,文档中有五个虚拟元素。前两个虚拟元素是文档中定义的两个li元素,如下所示。

1. li - 10
2. li - 20

对于前两个li,我们可以使用所有选择器的元素修改方法,如attr()、style()、text()等,如下所示。

d3.select("#list").selectAll("li")
   .data([10, 20, 30, 25, 15])
   .text(function(d) { return d; });

text()方法中的函数用于获取li元素映射数据。这里,d对于第一li元素表示10,对于第二li元素表示20。

接下来的三个元素可以映射到任何元素,并且可以使用数据连接的 Enter() 和选择器的append() 方法来完成。Enter() 方法可以访问剩余数据(未映射到现有元素),append() 方法用于从相应数据创建新元素。让我们也为剩余的数据项创建li 。数据图如下 -

3. li - 30
4. li - 25
5. li - 15

创建新 li 元素的代码如下 -

d3.select("#list").selectAll("li")
   .data([10, 20, 30, 25, 15])
   .text(function(d) { return "This is pre-existing element and the value is " + d; })
   .enter()
   .append("li")
   .text(function(d) 
      { return "This is dynamically created element and the value is " + d; });

数据连接提供了另一种称为exit() 方法的方法来处理从数据集中动态删除的数据项,如下所示。

d3.selectAll("li")
   .data([10, 20, 30, 15])
   .exit()
   .remove()

在这里,我们使用 exit() 和 remove() 方法从数据集中删除了第四项及其相应的 li。

完整代码如下 -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         body { font-family: Arial; }
      </style>
   </head>

   <body>
      <ul id = "list">
         <li></li>
         <li></li>
      </ul>
        
      <input type = "button" name = "remove" value = "Remove fourth value" 
         onclick = "javascript:remove()" />
      
      <script>
         d3.select("#list").selectAll("li")
            .data([10, 20, 30, 25, 15])
            .text(function(d) 
               { return "This is pre-existing element and the value is " + d; })
            .enter()
            .append("li")
            .text(function(d) 
               { return "This is dynamically created element and the value is " + d; });
             
         function remove() {
            d3.selectAll("li")
            .data([10, 20, 30, 15])
            .exit()
            .remove()
         }
      </script>
   </body>
</html>

上述代码的结果如下 -

数据连接方法

数据连接提供了以下四种处理数据集的方法 -

  • 基准()
  • 数据()
  • 进入()
  • 出口()

让我们详细介绍一下这些方法。

datum() 方法

datum() 方法用于设置 HTML 文档中单个元素的值。一旦使用选择器选择了元素,就会使用它。例如,我们可以使用 select() 方法选择现有元素(p 标签),然后使用 datum() 方法设置数据。设置数据后,我们可以更改所选元素的文本或添加新元素并使用 datum() 方法使用数据集分配文本。

创建一个页面“datajoin_datum.html”并添加以下代码 -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <p></p>
      <div></div>
      <script>
         d3.select("p")
         .datum(50)
         .text(function(d) { 
            return "Used existing paragraph element and the data " + d + " is assigned."; 
         });
         
         d3.select("div")
         .datum(100)
         .append("p")
         .text(function(d) { 
            return "Created new paragraph element and the data " + d + " is assigned."; 
         });
      </script>
   </body>
</html>

上述代码的输出如下。

data() 方法

data() 方法用于将数据集分配给 HTML 文档中的元素集合。一旦使用选择器选择了 HTML 元素,就会使用它。在我们的列表示例中,我们使用它来设置li选择器的数据集。

d3.select("#list").selectAll("li")
   .data([10, 20, 30, 25, 15]);

Enter() 方法

Enter() 方法输出之前不存在图形元素的数据项集合。在我们的列表示例中,我们使用它来创建新的li元素。

d3.select("#list").selectAll("li")
   .data([10, 20, 30, 25, 15])
   .text(function(d) { return "This is pre-existing element and the value is " + d; })
   .enter()
   .append("li")
   .text(function(d) { return "This is dynamically created element and the value is " + d; });

exit() 方法

exit() 方法输出不再存在数据的图形元素集。在我们的列表示例中,我们使用它通过删除数据集中的数据项来动态删除li元素之一。

function remove() {
   d3.selectAll("li")
      .data([10, 20, 30, 15])
      .exit()
      .remove()
}

数据功能

在 DOM 操作章节中,我们了解了 D3.js 中不同的 DOM 操作方法,例如style()、text()等。这些函数中的每一个通常都采用常量值作为其参数。然而,在Data join的上下文中,它采用匿名函数作为参数。该匿名函数获取相应的数据以及使用 data() 方法分配的数据集的索引。因此,将为绑定到 DOM 的每个数据值调用这个匿名函数。考虑以下 text() 函数。

.text(function(d, i) {
   return d;
});

在此函数中,我们可以应用任何逻辑来操作数据。这些是匿名函数,这意味着没有与该函数关联的名称。除了数据(d)和索引(i)参数之外,我们可以使用关键字访问当前对象,如下所示 -

.text(function (d, i) {
   console.log(d); // the data element
   console.log(i); // the index element
   console.log(this); // the current DOM object
   return d;
});

考虑以下示例。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         body { font-family: Arial; }
      </style>
   </head>

   <body>
      <p></p>
      <p></p>
      <p></p>
      <script>
         var data = [1, 2, 3];
         var paragraph = d3.select("body")
         .selectAll("p")
         .data(data)
         .text(function (d, i) {
            console.log("d: " + d);
            console.log("i: " + i);
            console.log("this: " + this);
            return "The index is " + i + " and the data is " + d;
         });
      </script>
   </body>
</html>

上面的脚本将生成以下结果 -

在上面的示例中,参数“d”为您提供数据元素,“i”为您提供数组中数据的索引,“this”是当前 DOM 元素的引用。在本例中,它是段落元素。请注意,我们在上面调用了 .data(data) 函数。data() 函数向所选元素提供数据,在我们的例子中它是数据数组。

D3.js - SVG 简介

SVG 代表可缩放矢量图形。SVG 是一种基于 XML 的矢量图形格式。它提供了绘制不同形状的选项,例如直线、矩形、圆形、椭圆形等。因此,使用 SVG 设计可视化可为您提供更多功能和灵活性。

SVG的特点

SVG 的一些显着特征如下:

  • SVG 是一种基于矢量的图像格式,并且是基于文本的。
  • SVG 的结构与 HTML 类似。
  • SVG 可以表示为Document 对象模型
  • SVG 属性可以指定为属性。
  • SVG 应该具有相对于原点 (0, 0) 的绝对位置。
  • SVG 可以按原样包含在 HTML 文档中。

一个最小的例子

让我们创建一个最小的 SVG 图像并将其包含在 HTML 文档中。

步骤 1 - 创建一个 SVG 图像并将宽度设置为 300 像素,高度设置为 300 像素。

<svg width = "300" height = "300">

</svg>

这里,svg标签启动一个 SVG 图像,它具有宽度和高度作为属性。SVG 格式的默认单位是像素

步骤 2 - 创建一条从 (100, 100) 开始并在 (200, 100) 结束的线,并为该线设置红色。

<line x1 = "100" y1 = "100" x2 = "200" y2 = "200" 
   style = "stroke:rgb(255,0,0);stroke-width:2"/>

这里,line标签画一条线,它的属性x1,y1指起点,x2,y2指终点。style 属性使用描边描边宽度样式设置线条的颜色和粗细。

  • x1 - 这是第一个点的 x 坐标。

  • y1 - 这是第一个点的 y 坐标。

  • x2 - 这是第二个点的 x 坐标。

  • y2 - 这是第二个点的 y 坐标。

  • 描边- 线条的颜色。

  • 笔画宽度- 线条的粗细。

步骤 3 - 创建一个 HTML 文档“svg_line.html”并集成上述 SVG,如下所示 -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         body { font-family: Arial; }
      </style>
   </head>

   <body>
      <div id = "svgcontainer">
         <svg width = "300" height = "300">
            <line x1 = "100" y1 = "100" 
               x2 = "200" y2 = "200" style = "stroke:rgb(255,0,0);
               stroke-width:2"/>
         </svg>
      </div>
      <p></p>
      <p></p>
   </body>
</html>

上述程序将产生以下结果。

使用 D3.js 的 SVG

要使用 D3.js 创建 SVG,请按照以下步骤操作。

步骤 1 - 创建一个容器来保存 SVG 图像,如下所示。

<div id = "svgcontainer"></div>

步骤 2 - 使用 select() 方法选择 SVG 容器,并使用append() 方法注入 SVG 元素。使用 attr() 和 style() 方法添加属性和样式。

var width = 300;
var height = 300;
var svg = d3.select("#svgcontainer")
   .append("svg").attr("width", width).attr("height", height);

步骤 3 - 类似地,在svg元素内添加line元素,如下所示。

svg.append("line")
   .attr("x1", 100)
   .attr("y1", 100)
   .attr("x2", 200) 
   .attr("y2", 200)
   .style("stroke", "rgb(255,0,0)")
   .style("stroke-width", 2);

完整代码如下 -

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         body { font-family: Arial; }
      </style>
   </head>

   <body>
      <div id = "svgcontainer">
      </div>
      <script language = "javascript">
         var width = 300;
         var height = 300;
         var svg = d3.select("#svgcontainer")
            .append("svg")
            .attr("width", width)
            .attr("height", height);
         svg.append("line")
            .attr("x1", 100)
            .attr("y1", 100)
            .attr("x2", 200)
            .attr("y2", 200)
            .style("stroke", "rgb(255,0,0)")
            .style("stroke-width", 2);
      </script>
   </body>
</html>

上面的代码产生以下结果。

矩形元素

矩形由<rect>标记表示,如下所示。

<rect x = "20" y = "20" width = "300" height = "300"></rect>

矩形的属性如下 -

  • x - 这是矩形左上角的 x 坐标。

  • y - 这是矩形左上角的 y 坐标。

  • width - 这表示矩形的宽度。

  • height - 这表示矩形的高度。

SVG 中的简单矩形定义如下。

<svg width = "300" height = "300">
   <rect x = "20" y = "20" width = "300" height = "300" fill = "green"></rect>
</svg>

可以如下所述动态创建相同的矩形。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div id = "svgcontainer"></div>
      <script>
         var width = 300;
         var height = 300;
         //Create SVG element
         var svg = d3.select("#svgcontainer")
            .append("svg")
            .attr("width", width)
            .attr("height", height);
         //Create and append rectangle element
         svg.append("rect")
            .attr("x", 20)
            .attr("y", 20)
            .attr("width", 200)
            .attr("height", 100)
            .attr("fill", "green");
      </script>
   </body>
</html>

上面的代码将产生以下结果。

圆形元素

圆由<circle>标签表示,如下所述。

<circle cx = "200" cy = "50" r = "20"/>

圆的属性如下 -

  • cx - 这是圆心的 x 坐标。

  • cy - 这是圆心的 y 坐标。

  • r - 表示圆的半径。

下面描述了 SVG 中的一个简单圆。

<svg width = "300" height = "300">
   <circle cx = "200" cy = "50" r = "20" fill = "green"/>
</svg>

可以如下所述动态创建相同的圆。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div id = "svgcontainer"></div>
      <script>
         var width = 300;
         var height = 300;
         //Create SVG element
         var svg = d3.select("#svgcontainer")
            .append("svg")
            .attr("width", width)
            .attr("height", height);
         //Append circle 
         svg.append("circle")
            .attr("cx", 200)
            .attr("cy", 50)
            .attr("r", 20)
            .attr("fill", "green");
      </script>
   </body>
</html>

上面的代码将产生以下结果。

椭圆单元

SVG Ellipse 元素由<ellipse>标签表示,如下所述。

<ellipse cx = "200" cy = "50" rx = "100" ry = "50"/>

椭圆的属性如下 -

  • cx - 这是椭圆中心的 x 坐标。

  • cy - 这是椭圆中心的 y 坐标。

  • rx - 这是圆的 x 半径。

  • ry - 这是圆的 y 半径。

下面描述了 SVG 中的一个简单椭圆。

<svg width = "300" height = "300">
   <ellipse cx = "200" cy = "50" rx = "100" ry = "50" fill = "green" />
</svg>

可以动态创建相同的椭圆,如下所示,

<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <div id = "svgcontainer"></div>
      <script>
         var width = 300;
         var height = 300;
         var svg = d3.select("#svgcontainer")
            .append("svg")
            .attr("width", width)
            .attr("height", height);
         svg.append("ellipse")
            .attr("cx", 200)
            .attr("cy", 50)
            .attr("rx", 100)
            .attr("ry", 50)
            .attr("fill", "green")
      </script>
   </body>
</html>

上面的代码将产生以下结果。

D3.js - SVG 转换

SVG 提供了用于转换单个 SVG 形状元素或一组 SVG 元素的选项。SVG 变换支持平移、缩放、旋转倾斜。让我们在本章中学习转变。

SVG 转换简介

SVG引入了一个新的属性transform来支持变换。可能的值是以下一项或多项,

  • 平移- 有两个选项,tx指沿 x 轴的平移,ty指沿 y 轴的平移。例如- 翻译(30 30

  • Rotate - 它需要三个选项,angle指旋转角度,cxcy指 x 轴和 y 轴的旋转中心。如果未指定cxcy,则默认为坐标系的当前原点。例如-旋转(60)。

  • Scale - 有两个选项,sx指沿 x 轴的缩放因子,sy指沿 y 轴的缩放因子。这里,sy是可选的,如果未指定,则它采用sx的值。例如- 规模(10)

  • Skew (SkewX 和 SkewY) - 它需要一个选项;倾斜角度是指沿 x 轴(SkewX)的角度和沿 y 轴(SkewY)的角度。例如- skewx(20)。

带有平移的 SVG 矩形的示例,描述如下 -

<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <svg width = "300" height = "300">
         <rect x = "20" 
            y = "20"
            width = "60"
            height = "60"
            fill = "green"
            transform = "translate(30 30)">
         </rect>
      </svg>
   </body>
</html>

上面的代码将产生以下结果。

可以使用空间作为分隔来为单个 SVG 元素指定多个转换。如果指定了多个值,则将按照指定的顺序一一应用转换。

<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <svg width = "300" height = "300">
         <rect x = "20" 
            y = "20" 
            width = "60" 
            height = "60" 
            fill = "green" 
            transform = "translate(60 60) rotate(45)">
         </rect>
      </svg>
   </body>
</html>

上面的代码将产生以下结果。

转换也可以应用于 SVG 组元素。这使得能够转换 SVG 中定义的复杂图形,如下所述。

<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <svg width = "300" height = "300">
         <g transform = "translate(60,60) rotate(30)">
            <rect x = "20" 
               y = "20" 
               width = "60" 
               height = "30" 
               fill = "green">
            </rect>
            <circle cx = "0" 
               cy = "0" 
               r = "30" 
               fill = "red"/>
         </g>
      </svg>
   </body>
</html>

上面的代码将产生以下结果。

一个最小的例子

要创建 SVG 图像,尝试使用变换来缩放和旋转它,让我们按照下面给出的步骤操作。

步骤 1 - 创建 SVG 图像并将宽度设置为 300 像素,高度设置为 300 像素。

<svg width = "300" height = "300">

</svg>

步骤 2 - 创建一个 SVG 组。

<svg width = "300" height = "300">
   <g>
   </g>
</svg>

步骤 3 - 创建一个长度为 60、高度为 30 的矩形并用绿色填充它。

<svg width = "300" height = "300">
   <g>
      <rect x = "20" 
         y = "20" 
         width = "60" 
         height = "30" 
         fill = "green">
      </rect>
   </g>
</svg>

步骤 4 - 创建一个半径为 30 的圆并用红色填充它。

<svg width = "300" height = "300">
   <g>
      <rect x = "20" 
         y = "20" 
         width = "60" 
         height = "30" 
         fill = "green">
      </rect>
      <circle cx = "0" 
         cy = "0" 
         r = "30" 
         fill = "red"/>
   </g>
</svg>

步骤 5 - 添加变换属性并添加平移和旋转,如下所示。

<svg width = "300" height = "300">
   <g transform = "translate(60,60) rotate(30)">
      <rect x = "20" 
         y = "20" 
         width = "60" 
         height = "60" 
         fill = "green">
      </rect>
      <circle cx = "0" 
         cy = "0" 
         r = "30" 
         fill = "red"/>
   </g>
</svg>

步骤 6 - 创建一个 HTML 文档“svg_transform_rotate_group.html”并集成上述 SVG,如下所述。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         body { font-family: Arial; }
      </style>
   </head>

   <body>
      <div id = "svgcontainer">
         <svg width = "300" height = "300">
            <g transform = "translate(60,60) rotate(30)">
               <rect x = "20" 
                  y = "20" 
                  width = "60" 
                  height = "60" 
                  fill = "green">
               </rect>
               <circle cx = "0" 
                  cy = "0" 
                  r = "30" 
                  fill = "red"/>
            </g>
         </svg>
      </div>
   </body>
</html>

上面的代码将产生以下结果。

使用 D3.js 进行转换

要使用 D3.js 创建 SVG,请按照以下步骤操作。

步骤 1 - 创建一个容器来保存 SVG 图像,如下所述。

<div id = "svgcontainer"></div>

步骤 2 - 创建 SVG 图像,如下所述。

var width = 300;
var height = 300;
var svg = d3.select("#svgcontainer")
   .append("svg")
   .attr("width", width)
   .attr("height", height);

步骤 3 - 创建 SVG 组元素并设置平移和旋转属性。

var group = svg.append("g").attr("transform", "translate(60, 60) rotate(30)");

步骤 4 - 创建一个 SVG 矩形并将其附加到组内。

var rect = group
   .append("rect")
   .attr("x", 20)
   .attr("y", 20)
   .attr("width", 60)
   .attr("height", 30)
   .attr("fill", "green")

步骤 5 - 创建一个 SVG 圆并将其附加到组内。

var circle = group
   .append("circle")
   .attr("cx", 0)
   .attr("cy", 0)
   .attr("r", 30)
   .attr("fill", "red")

完整代码如下 -

<!DOCTYPE html>
<html lang = "en">
   <head>
      <title>SVG rectangle</title>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         body { font-family: Arial; }
      </style>
   </head>

   <body>
      <div id = "svgcontainer"></div>
         <script language = "javascript">
            var width = 300;
            var height = 300;
            var svg = d3.select("#svgcontainer")
               .append("svg")
               .attr("width", width)
               .attr("height", height);

            var group = svg.append("g")
               .attr("transform", "translate(60, 60) rotate(30)");
            
            var rect = group.append("rect")
               .attr("x", 20)
               .attr("y", 20)
               .attr("width", 60)
               .attr("height", 30)
               .attr("fill", "green")
            
            var circle = group
               .append("circle")
               .attr("cx", 0)
               .attr("cy", 0)
               .attr("r", 30)
               .attr("fill", "red")
         </script>
      </div>
   </body>
</html>

上面的代码将产生以下结果。

变换库

D3.js 提供了一个单独的库来管理转换,无需手动创建转换属性。它提供了处理所有类型转换的方法。其中一些方法是transform()、translate()、scale()、rotate()等。您可以使用以下脚本在网页中包含d3-transform 。

<script src = "http://d3js.org/d3.v4.min.js"></script>
<script src = "d3-transform.js"></script>

在上面的例子中,变换代码可以写成如下所示 -

var my_transform = d3Transform()
   .translate([60, 60])
   .rotate(30);

var group = svg
   .append("g")
   .attr("transform", my_transform);

D3.js - 过渡

过渡是项目从一种状态变为另一种状态的过程。D3.js提供了一个transition()方法来在HTML页面中执行转换。让我们在本章中了解过渡。

过渡()方法

transition() 方法适用于所有选择器,它启动转换过程。该方法支持大多数选择方法,例如 attr()、style() 等。但是,它不支持append() 和data() 方法,这些方法需要在transition() 方法之前调用。此外,它还提供了特定于转换的方法,如uration()、ease()等。一个简单的转换可以定义如下 -

d3.select("body")
   .transition()
   .style("background-color", "lightblue");

可以使用 d3.transition() 方法直接创建转换,然后与选择器一起使用,如下所示。

var t = d3.transition()
   .duration(2000);
d3.select("body")
   .transition(t)
   .style("background-color", "lightblue");

一个最小的例子

现在让我们创建一个基本示例来了解过渡的工作原理。

使用以下代码创建一个新的 HTML 文件,transition_simple.html 。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <h3>Simple transitions</h3>
      <script>
         d3.select("body").transition().style("background-color", "lightblue");
      </script>
   </body>
</html>

在这里,我们选择了body元素,然后通过调用transition()方法开始转换。然后,我们指示将背景颜色从当前颜色白色转换为浅蓝色

现在,刷新浏览器,屏幕上的背景颜色从白色变为浅蓝色。如果我们想将背景颜色从浅蓝色更改为灰色,我们可以使用以下过渡 -

d3.select("body").transition().style("background-color", "gray");

D3.js - 动画

D3.js 通过过渡支持动画。我们可以通过正确使用过渡来制作动画。过渡是关键帧动画的有限形式,只有两个关键帧 - 开始和结束。起始关键帧通常是 DOM 的当前状态,结束关键帧是一组属性、样式和您指定的其他属性。转换非常适合转换到新视图,而无需依赖于起始视图的复杂代码。

示例- 让我们考虑“transition_color.html”页面中的以下代码。

<!DOCTYPE html>
<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
   </head>

   <body>
      <h3