D3.js

介绍

  • 概述:D3.js(Data-Driven Documents)由 Mike Bostock (著名的计算机科学家和数据可视化专家)创建。是一个用于基于数据的文档操作的JavaScript库。它使用HTML, SVG, 和 CSS 来将数据生动地展现出来。D3.js 的核心理念是利用数据来驱动文档的生成和操作,使数据可视化成为可能。
  • 主要用途:创建数据可视化,包括但不限于条形图、折线图、饼图、散点图、地图、树图、力导向图等。D3.js 强大的数据绑定能力和丰富的图形操作方法,让开发者能够构建高度交互性和动态性的数据可视化应用。D3.js 不仅仅是一个图表库,它提供了一整套工具,使得开发者能够从基础的图形元素出发,构建出完全定制化的可视化效果。
  • 官网:D3 by Observable | The JavaScript library for bespoke data visualization

2. 核心概念

1.数据绑定 (Data Binding)

D3.js 允许将数据绑定到 DOM 元素上。通过使用 `enter`、`exit` 和 `update` 模式,可以控制数据集合的增加、删除和修改对应的可视化元素。

2. 选择集 (Selections)

使用选择集来选择和操作文档对象模型(DOM)中的元素。你可以使用 CSS 选择器来选择元素,并对选择集中的元素进行链式操作,如属性设置、样式调整、事件监听等。

3. 动态属性 (Dynamic Properties)

属性和样式可以设置为动态的,基于数据来定义。你可以使用匿名函数来根据绑定的数据动态地计算属性值。

4. 转换 (Transitions):

D3.js 提供了强大的过渡效果,可以在元素的属性或样式从一个值平滑过渡到另一个值。这使得动画效果的实现变得简单而且具有高度的可控性。

5. 比例尺 (Scales):

比例尺是将数据的域(domain)映射到可视化的范围(range)的函数。D3.js 提供了多种比例尺,如线性、对数、序数、时间等,以支持不同类型的数据和可视化需求。

6. 生成器 (Generators):

D3.js 包含了多种生成器,用于创建常见的图形元素,如柱状图、线条、饼图、区域图等。这些生成器可以简化复杂图形的绘制过程。

7. 轴 (Axes):

轴生成器可以根据比例尺自动生成坐标轴,包括刻度和标签。这简化了坐标轴的创建和更新过程。

8. 布局 (Layouts):

D3.js 提供了多种布局算法,如饼图、力导向图、树状图、捆绑图等,这些布局算法可以帮助组织和展示复杂的数据结构。

9. SVG 操作:

由于 D3.js 主要使用 SVG 来创建图形,因此对 SVG 元素的创建、修改和变换是其核心功能之一。

10. 交互性 (Interactivity):

支持丰富的事件监听器和交互设计,允许开发者创建高度交互式的数据可视化,响应用户的输入和操作。

11. 数据加载和格式化:

提供了强大的数据加载和格式化工具,支持多种数据格式,如 CSV、TSV、 JSON 等,并允许开发者对数据进行解析、格式化和转换。

3. 实际应用

D3.js几乎可以在任何需要数据可视化的地方找到它的应用。以下是D3.js的一些实际应用场景:

  1. 信息图表(Infographics):创建动态和交互式的信息图表,将数据以视觉吸引的方式展现给用户。
  2. 数据探索工具:构建允许用户通过不同的视角和维度来探索数据集的工具,例如股票市场的数据仪表盘。
  3. 地理数据可视化:利用D3的地图功能,可以创建地图和其他地理信息可视化,比如世界地图上的人口分布、气候变化数据等。
  4. 实时数据可视化:D3可以用来构建实时数据流的可视化,如监控仪表盘、网络流量统计、社交媒体活动的实时更新等。

业内使用案例:

  1. 纽约时报(The New York Times):纽约时报的数据可视化团队广泛使用D3.js来创建互动式图表和地图,以丰富其新闻报道,让读者能够通过可视化深入理解复杂的数据故事。
  2. FiveThirtyEight:这个知名的统计分析网站使用D3.js来创建选举预测、体育分析和经济数据的可视化。
  3. Airbnb:Airbnb使用D3.js来分析和可视化房源数据和用户行为数据,以改善其服务和用户体验。
  4. GitHub:GitHub在一些页面上使用D3.js进行数据可视化,比如用户的贡献活动、代码库的统计数据等。
  5. Google Trends:Google Trends 使用D3.js来可视化搜索趋势,用户可以看到不同时间、地点和查询的流行度变化。
  6. Weather.com:Weather.com 使用D3.js来展示复杂的天气数据和模式,如风速图和降水图。

4.官网案例

力导向布局: Disjoint force-directed graph / D3 | Observable
布局树: Collapsible tree / D3 | Observable
demo: http://localhost:3000

力导向布局(Force-Directed Layout):是一种模拟物理系统中力的作用来可视化图形数据的算法。在网络图中,节点通常表示实体,而边表示实体间的关系。力导向布局通过模拟力的作用来自动排列节点,使得整个网络图达到一种视觉上平衡的状态。

  • 原理:力导向布局的基本原理是为图中的每个节点赋予一些物理特性(如电荷或质量)以及模拟的力(如斥力或引力),然后通过物理模拟来找到一个系统能量最低的稳定状态,从而确定节点的位置。
  • 常见的几种力:
  1. 斥力:通常,每个节点被赋予相同的电荷,因此它们会互相排斥。这种斥力确保节点不会过于靠近,从而避免重叠。
  2. 引力:节点之间的边像弹簧一样工作,它们尝试将相连的节点拉近。这种弹簧力的强度可以表示连接的强度。
  3. 中心引力:有时,会有一个引力将所有节点拉向布局的中心。这可以帮助将图保持在视觉上的中心,并防止节点漂移到布局的外围。
  4. 碰撞力:为了防止节点重叠,可以添加一个碰撞检测机制,它会在节点相互靠近到一定距离时产生排斥力。
  • 力导向布局通常是一个迭代过程:
  1. 初始化:节点被赋予随机的初始位置。
  2. 力的计算:在每次迭代中,计算作用在每个节点上的合力。
  3. 位置更新:根据合力移动节点,节点的位移可以通过模拟物理运动(如考虑速度和摩擦力)来计算。
  4. 冷却:随着迭代的进行,通过所谓的“冷却参数”来减少节点的位移量,使得布局逐渐稳定下来。
  5. 终止条件:当节点的移动量小于某个阈值或迭代次数达到预设的上限时,算法停止。
  • 自定义和优化

在D3.js中,力导向布局是高度可定制的。开发可调整以下参数:

  1. 力的强度:改变斥力和引力的系数。
  2. 距离:调整弹簧力(边)的理想长度。
  3. 冷却参数:控制算法的收敛速度。
  4. 碰撞检测:设置节点的半径,以避免重叠。

此外,为了优化大型图的性能,D3.js提供了一些策略,例如使用四叉树(quadtree)来优化斥力的计算,或者限制节点的位移量以防止过大的跳跃。尤其适用于表现复杂网络的结构和关系,如社交网络、生物网络、组织结构等。通过适当的调整和优化,它可以生成易于理解和探索的网络可视化。

5. 总结

D3.js、ECharts 和 Highcharts 都是流行的 JavaScript 数据可视化库,但它们在设计和功能上有所不同。D3.js 提供了更多的灵活性和控制能力,而 ECharts 和 Highcharts 更侧重于易用性和预设的图表类型。

以下是 D3.js 一些优势:

  1. 定制化和灵活性:

D3.js 提供了极高的定制化能力。如果你需要创建一个完全定制的可视化,或者一个非标准的图表类型,D3.js 提供了构建它的基础工具。而 ECharts 和 Highcharts 主要提供预先定义的图表类型,对于高度个性化的需求或者非常规的图表设计,它们可能无法提供足够的灵活性。

  1. 底层操作:

D3.js 允许直接操作 SVG 和 HTML 元素,这意味着可以创建完全独特的交互和动画效果。而 ECharts 和 Highcharts 的底层操作更为有限,它们通过封装的接口提供交互和动画功能,这在大多数情况下是足够的,但对于特殊需求可能就不够灵活了。

  1. 集成复杂交互:

D3.js 可以更好地集成复杂的用户交互,因为它允许开发者直接控制事件监听和响应。如果你的应用程序需要复杂的交互逻辑,比如定制的拖拽行为、复杂的工具提示或者交互式的图表联动。

  1. 大型数据集的性能优化:

对于大型数据集的性能优化,D3.js 允许你有更细粒度的控制,比如使用 Canvas 替代 SVG 来渲染数以万计的元素。虽然 ECharts 和 Highcharts 都支持大数据集,但 D3.js 在处理巨大数量级的数据时,可以通过底层优化提供更好的性能。

  1. 复杂布局算法:

D3.js 提供了一系列复杂的布局算法,例如力导向图、树状图、捆图等,这些算法可以用来生成复杂的层次结构或网络结构的可视化。虽然 ECharts 和 Highcharts 也提供了一些这样的图表类型,但 D3.js 提供了更多的定制选项和控制。

总的来说,如果需要快速生成标准的图表,并且不需要太多定制,ECharts 和 Highcharts 是很好的选择。但如果需要完全控制可视化的外观和行为,或者需要创建非常个性化的可视化,D3.js 可能是更合适的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python考试复习--day3

1.统计字符串个数 ninput() z0 s0 k0 o0 for i in n:if i.isalpha():zz1elif i.isnumeric():ss1elif i.isspace():k1else:o1 print(字母有{}个,数字有{}个,空格有{}个,其他字符{}个.format(z,s,k,o))2.分类统计字符 ninput() x0 d0 s0 k0 o0 for i in n:if i.islower():x1elif …

程序员创业选搭档很重要

技术人员创业,选对搭档至关重要。 对于想要开展软件项目的技术人员来说,找到一位优秀的技术搭档是极其重要的。 仅仅依靠社会上招聘人员并支付工资的方式,成功的可能性并不高(这种方式只适用于已有一定规模的公司进行定向开发&a…

韩愈,文起八代之衰的儒学巨匠

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 韩愈,字退之,生于唐代宗大历三年(公元768年),卒于唐穆宗长庆四年(公元82…

get()和 load()的区别?

get()和load()是两个不同的函数,它们的主要区别在于它们用于不同的情况。 get()函数:get()函数通常用于从数据库或其他数据源中检索数据。它接受一个参数,通常是一个唯一标识符,用于指定要检索的特定数据。如果找到匹配项&#xf…

wpf自定义按钮样式

在WPF中&#xff0c;自定义按钮样式可以通过创建一个ControlTemplate来实现。以下是一个简单的自定义按钮样式的例子&#xff1a; 首先&#xff0c;在你的WPF项目资源字典中定义按钮的ControlTemplate。 <Window.Resources><ControlTemplate x:Key"CustomButto…

武汉网红餐馆火灾背后的安全警示:可燃气体报警器需定期校准

在餐饮业快速发展的今天&#xff0c;安全问题一直是行业内外关注的重点。 最近&#xff0c;武汉一家网红餐馆在就餐高峰期突发火灾&#xff0c;事件迅速成为公众关注的焦点。这一事故不仅给餐馆带来了重大损失&#xff0c;也引发了对于餐馆安全管理的深思。 尤其是可燃气体报…

基于SqlSugar的开发框架循序渐进介绍(20)-- 在基于UniApp+Vue的移动端实现多条件查询的处理

在做一些常规应用的时候&#xff0c;我们往往需要确定条件的内容&#xff0c;以便在后台进行区分的进行精确查询&#xff0c;在移动端&#xff0c;由于受限于屏幕界面的情况&#xff0c;一般会对多个指定的条件进行模糊的搜索&#xff0c;而这个搜索的处理&#xff0c;也是和前…

关于亚马逊、速卖通、虾皮、Lazada等平台自养号测评IP的重要性

在自养号测评中&#xff0c;IP的纯净度是一个至关重要的问题&#xff0c;它直接关系到账号的安全性和稳定性如果使用了被平台识别为异常或存在风险的IP地址&#xff0c;那么账号可能会面临被封禁的风险。这将对账号的正常使用和测评过程中造成严重影响。而使用纯净的IP地址&…

使用 Django ORM 进行数据库操作

文章目录 创建Django项目和应用定义模型查询数据更新和删除数据总结与进阶聚合和注解跨模型查询原始SQL查询 Django是一个流行的Web应用程序框架&#xff0c;它提供了一个强大且易于使用的对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;用于与数据库进行交互。在本文…

Flutter 中的 DefaultTabController 小部件:全面指南

Flutter 中的 DefaultTabController 小部件&#xff1a;全面指南 在Flutter中&#xff0c;DefaultTabController是一个用于管理Tab控制器的widget&#xff0c;它允许你控制Tab视图的初始索引和动态更新。这个组件在实现具有可滚动标签页的界面时非常有用&#xff0c;例如在设置…

优路教育:为行业发展培养高素质技术技能人才,推进新质生产力发展

职业教育是面向行业、企业培养技术技能人才的特色类型教育。随着技术和市场的加速演进&#xff0c;新技术、新业态出现&#xff0c;相应地迭现出众多新兴职业&#xff0c;也暴露了各新兴领域庞大的人才缺口。其中&#xff0c;高技能人才的高需求&#xff0c;也为职业教育育人标…

Java中的代理模式:灵活地控制对象访问和行为

代理模式是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理对象&#xff09;代替另一个对象&#xff08;被代理对象&#xff09;来控制对其的访问。代理对象通常在不改变原始对象的情况下&#xff0c;提供额外的功能或控制访问的方式。在Java编程中&#xff0c;…

大数据开发面试题【数仓篇】

197、数据仓库和传统数据库区别 由于历史数据使用频率过低&#xff0c;导致数据堆积&#xff0c;查询性能下降&#xff1b;用于查询分析&#xff0c;涉及大量的历史数据&#xff0c;数据仓库中的数据一般来日志文件和事务 数据库是跟业务挂钩的&#xff0c;数据库不可能装下一…

教育新篇章:AI工具Sora引领学习新趋势

Sora——这个让人在24年初引爆AI圈的新产品&#xff0c;它究竟会如何改变我们的教育领域呢&#xff1f; 从gpt到Sora&#xff0c;从对话型的ai到游戏和短剧制作的新风口&#xff0c;我们从23年到24年一个接一个地被震惊&#xff01; Sora能够根据文本提示生成高质量的视频内容…

当 GIS 遇上 AI 大模型

今年整个 IT 界、甚至科技界最火爆的技术就是 AI 大模型了&#xff0c;没有之一。 以 OpenAI 的 GPT 为代表、国内外一众大模型跟进&#xff0c;形成了百模齐奔的态势。围绕着大模型&#xff0c;各项周边的应用也在快速发展。在 2023 年年底的云栖大会上&#xff0c;论坛标题带…

LVM部署手册

目录 前言 一、LVM的基本概念 二、LVM的特点 三、LVM的应用场景 四、总结 资源列表 一、基础环境 关闭防火墙 关闭内核安全机制 设置主机名 二、磁盘分区 使用fdisk命令将磁盘划分为三个主分区 将这三个分区ID标记好修改为”8e“ 三、创建物理卷 创建物理卷 查…

Vue3(TypeScript)-CSSProperties代码示例及用法详解

Vue3-CSSProperties代码示例及用法 在Vue3中封装一个可复用的公共CSSProperties // 目录 /xxx/src/hooks/use-scroll-updown-bottom-content/index.ts 全局定义hooks import { computed } from vue import type { CSSProperties } from vuetype UpDownOperationType up | down…

一个基于预训练的DenseNet121模型的人脸年龄分类系统

这篇文章采用预训练的DenseNet121模型并使用自定义的数据集类和自定义的类似正态分布的标签平滑策略来训练了一个人脸年龄分类模型&#xff0c;最后基于这个模型用tk实现了一个娱乐向的小系统。 数据集展示&#xff1a; 两个文件夹&#xff0c;分别是训练集和测试集&#xff0…

Bootstrap 3.x 版本基础引入指南

Bootstrap 是一款广受欢迎的前端框架&#xff0c;它简化了网页设计与开发流程&#xff0c;帮助开发者快速创建响应式布局和美观的网页界面。本文将向您介绍如何在项目中引入 Bootstrap 3.x 版本的基本步骤&#xff0c;包括 CSS 和 JavaScript 文件的引用&#xff0c;以及必要的…

java根据不同类型跳转相应的实现类

1 不同实现类字典 AllArgsConstructor Getter public enum SendMessageEnum {HUAWEI("AndHWPush"),JIGUANG("AndJPush"),MEIZU("AndMZPush"),OPPO("AndOppoPush"),XIAOMI("AndXMPush"),XINGE("AndXinGePush"),;p…