前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >D3.js 满足你对数据可视化的一切幻想

D3.js 满足你对数据可视化的一切幻想

作者头像
企鹅号小编
发布于 2018-01-25 06:46:28
发布于 2018-01-25 06:46:28
3.1K0
举报
文章被收录于专栏:应用案例应用案例

D3.js

D3的全称是Data-Driven Documents(数据驱动的文档),是一个用来做数据可视化的JavaScript函数库,而JavaScript文件的后缀通常为.js,所以D3被称为D3.js。

对D3来说,柱形图、散点图、折线图、饼图、弦图、力导向图、树状图等等都不在话下。总之,只要你愿意写代码,D3.js可以满足你对数据可视化的一切幻想。

今天我们以弦图为例进行介绍。

弦图

弦图主要用于表示两个节点之间的联系。两点之间的连线表示二者具有联系,线的粗细表示权重。

下面是之前做的一张电影类型相关性的弦图。

弦图

准备工作

D3是在HTML和CSS文件中编写代码,在浏览器中显示结果。

HTML文件用来描述内容,CSS文件用来定义内容的样式。定义样式可以单独写在外部CSS文件中,在HTML中用引用;也可以直接写在HTML文件中,在

body {

font: 20px sans-serif;

} //定义字号字体

.group-tick line {

stroke:#000000;

} //定义描边

.ribbons {

fill-opacity: 0.67;

} //定义填充不透明度

代码用来定义样式。

CSS选择器有多种类型。

元素选择器以HTML元素的标签作为名称,如:

body { font: 20px sans-serif;}

则所有主体内容的字号和字体都这样显示。

类选择器是在选择器名称前加一个点(.),如:

.ribbons { fill-opacity: 0.67;}

之后需要应用的话,在元素标签中添加一个class属性即可,后续我们会写到。

另外还有选择器分组、ID选择器、派生选择器,由于这次代码未涉及,暂不赘述。

//定义图形大小

SVG指可缩放矢量图形,绝大部分浏览器都支持,可以利用标签将形状嵌入HTML中。

var leixing = [ "喜剧" , "剧情" , "动作" , "冒险" , "爱情", "惊悚" , "动画" , "奇幻" , "悬疑" , "科幻"]; //定义类型标签

var matrix = [

[77, 108, 88,110,245,12,110,50,25,17],

[108, 102, 117,37,180,67,13,27,79,20],

[88,117,9,133,54,103,22,59,43,96],

[110, 37, 133,3,21,32,141,98,16,60],

[245, 180, 54,21,59,15,3,33,33,7],

[12, 67, 103,32,15,18,1,13,111,33],

[110, 13, 22,141,3,1,12,60,5,12],

[50, 27, 59,98,33,13,60,0,5,13],

[25, 79, 43,16,33,111,5,5,1,12],

[17, 20, 96,60,7,33,12,13,12,0]

]; //输入类型相关性数据

由于统计的是10种电影类型之间的交叉关系,所以是一个对称矩阵。

所以如果你也想画一个10个元素的弦图,也可以不看下边的内容,直接复制代码,修改这两段数据即可。

var svg = d3.select("svg"),

width = +svg.attr("width"),

height = +svg.attr("height"),

outerRadius = Math.min(width, height) * 0.5 - 40,

innerRadius = outerRadius - 40; //定义外部弦和内部弦的大小

绘制外部弦

var chord = d3.chord()

.padAngle(0.05) //设置外部弦间的角填充,也就是弦之间的间距

.sortSubgroups(d3.descending);//设置用于子分组的比较器

var arc = d3.arc()

.innerRadius(innerRadius)

.outerRadius(outerRadius);

var ribbon = d3.ribbon()

.radius(innerRadius);

var color = d3.scaleOrdinal()

.domain(d3.range(4))

.range(["#8EC21E","#C3D968","#009DE6","#7CCDF3","#E51573","#EC799F","#F39820","#FCD35A","#A0A0A2","#C9C9CA"]); //设置颜色(和元素标签数量相等即可,在本例中为10)

var g = svg.append("g")

.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")

.datum(chord(matrix));

var group = g.append("g")

.attr("class", "groups")

.selectAll("g")

.data(function(chords) { return chords.groups; })

.enter().append("g");

group.append("path")

.style("fill", function(d) { return color(d.index); })

.attr("d", arc);

写到这里,在代码末尾包含结束符“”的情况下,可以运行出以下结果。

添加标签

group.append("text")

.each(function(d,i) { d.angle = (d.startAngle + d.endAngle) / 2;d.name = leixing[i]; })

.attr("dy", ".35em")

.attr("transform", function(d){

return "rotate(" + ( d.angle * 180 / Math.PI ) + ")" +"translate(0,"+ -1.0*(outerRadius+10) +")" +( ( d.angle > Math.PI*3/4 && d.angle < Math.PI*5/4 ) ? "rotate(180)" : "");})

.text(function(d) { return d.name; });

var groupTick = group.selectAll(".group-tick")

.data(function(d) { return groupTicks(d, 1e3); })

.enter().append("g")

.attr("class", "group-tick")

.attr("transform", function(d) { return "rotate(" + (d.angle * 180 / Math.PI - 90) + ") translate(" + outerRadius + ",0)"; });

写到这里,在代码末尾包含结束符“”的情况下,可以运行出以下结果。

绘制内部弦

g.append("g")

.attr("class", "ribbons")

.selectAll("path")

.data(function(chords) { return chords; })

.enter().append("path")

.attr("d", ribbon)

.style("fill", function(d) { return color(d.target.index); })

function groupTicks(d, step) {

var k = (d.endAngle - d.startAngle) / d.value;

return d3.range(0, d.value, step).map(function(value) {

return ;

});

}

//不要忘记最后的结束标签

中文乱码

本文来自企鹅号 - 数厨小主媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 数厨小主媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NativePHP桌面版篇〡服务启动运行流程图
NativePHP 是一种通过将 PHP 代码编译成原生二进制代码,使开发者能够使用 PHP 语言来构建原生应用程序。与传统的 PHP 脚本不同,NativePHP 应用程序可以直接在操作系统的本机环境中运行,无需依赖 Web 服务器或解释器。
Tinywan
2025/04/21
1080
NativePHP桌面版篇〡服务启动运行流程图
NativePHP 的技术原理和实现细节
这篇文章主要想探讨一下 NativePHP 的实现细节、使用了哪些技术、它的生命周期和工作原理等,如果文章中有任何纰漏,欢迎留言指正。
Tinywan
2023/09/06
8270
NativePHP 的技术原理和实现细节
Laravel + Vue 3(Vite、TypeScript)SPA 设置
在本教程中,我将向大家展示如何使用 Laravel + Vue 3 使用 typescript 和 Vite 设置你自己的单页应用程序。
海拥
2023/01/13
2.9K0
Laravel + Vue 3(Vite、TypeScript)SPA 设置
vite+react-ts+electron 开发桌面端
https://gitee.com/dmhsq/react-ts-vite-electron
代码哈士奇
2022/03/16
1.7K0
Laravel框架学习 -- 安装
Laravel 利用 Composer(Composer 中文)来管理其自身的依赖包。
lpe234
2020/07/27
1.9K0
记一次 Laravel5 升级到 Laravel10 经过 + 使用 octane 进行容器化
seth-shi
2024/04/29
2500
laravel 集成 vue3 的前端项目
现在大多项目都是前后端分离的,但是如果前后端都是一个人做,前后端来回切也挺不方便的。
崔哥
2024/05/15
6530
Laravel 广播
安装请移步 https://www.cuiwei.net/p/1659113677
崔哥
2023/03/24
2.7K0
Laravel 广播
php系列二之phpstorm Xdebug和laravel常见问题整理
因为 php artisan migrate:make 是 Laravel 4 的语法,而 Laravel5 已经换成了 php artisan make:migration
山行AI
2019/11/23
3.6K0
php系列二之phpstorm Xdebug和laravel常见问题整理
Electron13+Vue3+ElementPlus模仿macOS桌面版后台系统框架
electron-vue3-macOS 一款整合vite2.x+electron13跨平台构建模仿mac桌面UI后台管理系统。
andy2018
2021/06/24
3.2K2
Electron13+Vue3+ElementPlus模仿macOS桌面版后台系统框架
Laravel5.8开发环境搭建与CRUD应用实践
在这个面向初学者的教程中,我们将学习如何使用最新的PHP开发框架Laravel 5.8,来创建一个基于MySQL数据库的Web应用,实现联系人的增删改查功能。
用户1408045
2019/08/25
6.5K0
PHP-Casbin初学者快速入门套件 StarterKits
CasbinStarterKits是PHP-Casbin 的初学者工具包,基于 Laravel-Authz 构建,带有 Vue 3 和 Tailwind CSS 前端。
Tinywan
2024/11/21
1350
PHP-Casbin初学者快速入门套件 StarterKits
基于 RoadRunner 驱动 Octane 构建高性能 Laravel 应用
Laravel Octane 已于昨天发布了 Beta 版,关于 Laravel Octane 学院君在之前专门发布过一篇文章简单介绍过,这是 Laravel 官方提供的基于 Swoole/RoadRunner 构建高性能 Laravel 应用的解决方案,现在你可以按照官方文档安装这个扩展包并进行测试。
学院君
2023/03/03
2.2K0
基于 RoadRunner 驱动 Octane 构建高性能 Laravel 应用
使用Vite创建一个动态网页的前端项目
虽然现在的前端更新换代的速度很快,IDE和工具一批批的换,但是我们始终要理解一点基本的程序构建的思维,这些环境和工具都是为了帮助我们更快的发布程序。笔者还记得以前写前端代码的时候,只使用文本编辑器,然后在浏览器中刷新就可以了。对于纯前端项目,其实这样也是很方便的。不过一旦涉及到文件资源访问的问题就麻烦了,因为浏览器的安全限制,不能访问域以外的资源。那么你就需要将其部署到Web服务器中,这意味着你要起个服务器。另外,调试的时候也要每次都刷新页面;第三方依赖包的引入也是问题,需要自己去管理,然后进行引入。于是,像Vite这样的前端开发与构建工具就出现了,它可以帮助你将上述这些步骤自动化处理,加快你的前端程序的编程效率。这里笔者就总结一下如何使用Vite创建动态网页的前端项目。
charlee44
2025/05/22
2240
使用Vite创建一个动态网页的前端项目
牛哇,PHP这个开发框架真的好香!
之前写Java的mybatis各种sql的和字段的处理,试过php开发之后,确实很快啊。而且我也是从Java,golang裸转的php。这里不谈那种语言好坏之分。开发来说,拥抱技术,拥抱变化,公司用什么技术栈,你就用什么技术。熟练开发就好了。
千羽
2023/11/20
6530
牛哇,PHP这个开发框架真的好香!
IT开源资产管理与工作单系统介绍使用
描述:最近接手了公司的固定资产的管理工作,一看到用Excl记录的固定资产信息我就产生了一种想法,手工(上/下帐)管理太麻烦了于是找一款开源的固定资产管理进行管理。
全栈工程师修炼指南
2022/09/29
7.4K2
IT开源资产管理与工作单系统介绍使用
mark-text开发环境搭建启动
https://github.com/VampireAchao/marktext.git
阿超
2023/07/08
2880
mark-text开发环境搭建启动
IT打工人利器:推荐两款开源的公司固定资产管理工具
描述:最近接手了公司的固定资产的管理工作, 一看到用Excl记录的固定资产信息我就产生了一种想法, 手工(上/下帐)管理太麻烦了于是找一款开源的固定资产管理进行管理。
全栈工程师修炼指南
2024/04/10
7.3K0
IT打工人利器:推荐两款开源的公司固定资产管理工具
Electron: 如何以 Vue.js, Vuetify 开始应用
看完以上介绍,也明白了本文要做的事:用 Vue.js 与 Vuetify 组件,基于 Electron 来创建原生桌面应用。
GoCoding
2021/05/06
1.6K0
Electron: 如何以 Vue.js, Vuetify 开始应用
如何开发Vite3插件构建Electron开发环境
开发新版本 Vue 项目推荐你使用 Vite 脚手架构建开发环境,然而 Vite 脚手架更倾向于构建纯 Web 页面,而不是桌面应用,因此开发者要做很多额外的配置和开发工作才能把 Electron 引入到 Vue 项目中,这也是很多开发者都基于开源工具来构建 Electron+Vue 的开发环境的原因。
liulun
2022/11/18
1.8K0
如何开发Vite3插件构建Electron开发环境
推荐阅读
相关推荐
NativePHP桌面版篇〡服务启动运行流程图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档