D3全称是Data-Driven Documents数据驱动文档,是一个开源的javascript库,可以用于数据可视化图形的创建,该库更接近底层,与 g2、echarts 不同,d3 能直接操作 svg,所以拥有极大的自由度,几乎可以实现任何 2d 的设计需求。

正如其名 Data Driven Documents,其本质是将数据与 DOM 绑定,并将数据映射至 DOM 属性上,D3扮演的是一个驱动程序的角色,联系着数据和文档。

与echarts 相比,D3.js 不会生成事先定义好的图表,而是提供一些方法用来生成带数据的标签,绑定可视化的属性,由自己定义如何制作图表,还提供很多数据处方法,可以更好的显示的数据模型。echarts 可以提供更方便的图表组件,满足大部分的需求,D3.js 可以提供更丰富的自定义功能,适合定制化。

学习D3.js 更多的时候是学习它如何加载、绑定数据、数据处理、变换和过渡等这些方法的过程,而且D3.js 用了一种与 jQuery 一样的 链式语法。官方文档的 API 非常的多,本文也只是小小的记录一下项目实现。功能比较简单,做个记录。

下载依赖包: npm install d3 d3-graphviz@4

App.vue

<template>
<div id="app">
<Graph :code="jsonToDot()"/>
</div>
</template> <script>
import Graph from "./components/Graph"; // 封装了一个子组件
export default {
data() {
return {
dot: JSON.stringify({ // 测试数据
foo: ["bar", "buzz"],
bar: ["foo"],
norf: ["bar", "buzz"],
worf: ["a"],
fizz: ["buzz"],
worble:["norf","buzz"],
buzz:["norf","worf"],
a:["b","c"],
b:["d","f"]
})
};
},
components: {
Graph
},
methods: {
jsonToDot() { // 处理数据格式为 插件可以解析的格式
const json = JSON.parse(this.dot);
return (
Object.entries(json).reduce((acc, [node, dependencies]) => {
return dependencies.reduce(
/**
* 此处为单个节点关系,设置样式
* arrowsize: 箭头尺寸
* color:连接线的颜色
* style:节点边框形状,rounded 圆角
*/
(acc, dependency) => acc + ` "${node}" -> "${dependency}"\n [arrowsize=.4, color=grey, style="rounded"]`,
acc
);
/**
* 此处设置graph图所有点线关系的统一样式
* ranksep: node之间的间距
* graph - rankdir: 布局方向,LR从左到右,TB从上到下(默认)
* graph - bb: 以点为单位的绘图边界框
* node - margin: 节点内边距
* node - shape: 节点形状
* node - height: 节点高度
* node - style: 节点样式,圆角,填充色
* node - color: 颜色
* node - fillcolor: 背景填充色
* edge - style: 连线样式 solid实线
* edge - arrowhead: 连线箭头样式
* edge - arrowtail: 连线箭尾样式
* ......
* 还有很多属性,可参考下方提供的参考文档
*/
},`digraph G { ranksep = 2.0; graph [rankdir=LR,bb="0,0,412.05,372.8"];node [margin=".3,.1",shape=box,height=.3, style="rounded,filled", color="lightgreen", fillcolor="lightgreen"]; edge [style=solid,arrowhead=normal,arrowtail=dot,]; \n`) + "}"
);
}
}
};
</script>

Graph.vue: 其中/@hpcc-js/wasm/dist/index.min.js该文件服务器地址不是很稳定,建议下载下来,存在自己项目的服务器上。

<template>
<div>
<script src="https://unpkg.com/@hpcc-js/wasm/dist/index.min.js" type="javascript/worker"/>
<div id="graph"/>
</div>
</template>
<script>
import * as d3 from 'd3'
import * as d3Graphviz from 'd3-graphviz'
export default {
props: {
code: {
type: String,
default: `digraph G {
node [shape="record"];
edge [style="dashed"];
a -> b
}`
}
},
methods: {
render() {
// scale 缩放比例
// fit(true) 自适应缩放,当节点比较多时可以显示完成的图,但是会看不清楚,节点较少时,会很大,慎用!!默认值false
d3Graphviz.graphviz("#graph").width(window.innerWidth).height(1500).scale(0.8).attributer(function (d) {
// 当节点非常多时,默认将主节点调至视口中间。 适用于数据量差不多的数据,统一调整图表视口,否则数据较少时,图表上移可视窗口会看不见
/* const px2pt = 3 / 4;
* if (d.tag === 'svg') {
* var selection = d3.select(this);
* var width = d.attributes.width;
* var height = d.attributes.height;
* var w = d.attributes.viewBox.split(" ")[2];
* var h = d.attributes.viewBox.split(" ")[3];
* var x = (width - w) / 3;
* var y = height;
* console.log(width, height, w, h, x, y, width * px2pt, height * px2pt);
* // selection.attr("viewBox", -x + " " + y + " " + w + " " + (height * px2pt));
* d.attributes.viewBox = 0 + " " + 0 + " " + w + " " + h;
* }
*/
// 当节点非常多时,默认将主节点调至视口中间。比例是我自己估算的, 适用于数据数量不确定,相差较大的数据
const childNum = 8 / 5;
if (d.tag === 'g' && d.parent.tag == 'svg') {
if (d.children.length > 500) {
d.translation.y = d.children.length * childNum
}
}
}).renderDot(this.code)
}
},
mounted() {
this.render();
},
watch: {
code() {
this.render();
}
}
};
</script>

实现效果图:

官方文档:

Graphviz

d3-graphviz

官方案例参考 D3 Graphviz Examples:

案例列表: https://codesandbox.io/examples/package/d3-graphviz

本人参考案例:https://codesandbox.io/s/graph-viz-ltx0q-ltx0q?file=/src/App.vue

可视化—D3学习笔记小小案例记录一下的更多相关文章

  1. D3学习笔记一

    D3学习笔记一 什么是D3? D3(全称Data Driven Documents)是一个用来做Web数据可视化的JavaScript函数库.D3也称之为D3.js. D3是2011年由Mike Bo ...

  2. 活字格Web应用平台学习笔记4 - 添加记录

    今天继续学习活字格基础教程,目标是创建一个页面,增加记录. 开始之前,系统会自动把上一次的工程文件加载进来. 这是做好后的样子. 我点添加员工的超链接: 先后加了2条员工的信息进来. 不错,设计界面是 ...

  3. Houdini学习笔记——【案例二】消散文字制作

    [案例二]Houdini消散文字制作 一.Overview     文字通过时间轴中frame变化而碎裂从两边开始向着中间消散并向镜头移动. 效果 二.Sop(Surface OPerators or ...

  4. 活字格Web应用平台学习笔记 8 - 查询记录

    基础教程只剩一点点了,学完算了. 这一课的目标是:查询记录 这个操作的原理很简单,增加一个表格,绑定“部门”那个数据,然后增加一个命令,点击查询. 绑定命令: 完成后的实际界面,查询前面是个下拉框: ...

  5. cocos2d-x学习笔记--第一天记录

    1.环境安装 http://www.cocos2d-x.org/ ---下载2.2.3--解压 https://www.python.org/ ---2.7.6 系统环境变量 设置安装目录 2创建一个 ...

  6. vue学习笔记-遗留问题记录

    Node.js是什么?对node.js的理解 官网解释:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时. 这是一种通过JavaScript语言开发web服务端的东 ...

  7. 前端学习笔记--css案例

    要实现的案例: 1.分析布局 2.划分文件结构: 3.编写css代码 * { padding: 0; margin: 0; } body { font-size: 16px; color: burly ...

  8. Android(java)学习笔记86:案例短信发送器

    1.一般我们第一步都是先创建这个main.xml布局文件,这是良好的习惯: <?xml version="1.0" encoding="utf-8"?&g ...

  9. mybatis学习笔记1.零碎记录

    1.conf.xml文件中的一些标签先后顺序会有影响. conf.xml文件<configuration>标签对里面配置的<typeAliases>标签的位置还有讲究?我将其放 ...

  10. 【mpu6050】学习笔记——基础知识点记录

    如图: 假设为三维空间有一个向量R 满足关系:  即为加速度计的x轴,y轴,z轴. 对于MPU6050 其求出的数值为:    分母为灵敏度, ADCRx为读出值. 我关心的是Axr,Ayr,Azr即 ...

随机推荐

  1. echarts下划线实现

    echarts中无下划线实现,我采用图片填充文本块背景的方式实现 这是从 长空雁叫霜晨月 的博客中得到启发https://www.cnblogs.com/volodya/p/Echarts.html ...

  2. 使用docker 5分钟搭建一个博客(mysql+WordPress)

    目录 一.系统环境 二.前言 三.搭建博客 3.1 创建wordpress和mysql容器 3.2 在wordpress界面设置个人博客信息 3.3 WordPress容器创建命令的简化版本 一.系统 ...

  3. go 从入门到了解

    一,GO的安装与配置 官网:https://golang.org/dl/ 镜像:https://golang.google.cn/dl/ 1,GOPATH GOPATH在windows上的默认值:%U ...

  4. 部署springboot+vue项目文档(若依ruoyi项目部署步骤)

    摘自:https://blog.csdn.net/Dreamboy_w/article/details/104389797 部署springboot+vue项目文档(若依ruoyi项目部署步骤)一:部 ...

  5. C#开发的股票盯盘小工具——摸鱼助手,附源码

    写了个盯盘小工具,最近发现很多炒股的小伙伴,上班期间看手机频繁是不是影响不好?电脑上打开交易软件,那影响是不是更不好?所以我就写了个小工具,给大家"摸鱼"用.虽然是摸鱼用,但是平常 ...

  6. 音视频-YUV数据格式

    一.YUV格式 1)kCVPixelFormatType_420YpCbCr8PlanarFullRange = 'f420' 对应YUV I420格式 2)kCVPixelFormatType_42 ...

  7. Java中try catch finally 关键字

    异常处理中的几个常用关键字(try catch finally throw throws) 异常处理 java中提供一套异常处理机制,在程序发生异常时,可以执行预先设定好的处理程序, 执行完成后,程序 ...

  8. B站login-极验逆向

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 https:// ...

  9. elementUI slider组件,带范围选择实现双向绑定

    网上查过很多相关文章都没有一章是写element ui滑块带范围实现双向绑定 二个滑块二头的数据怎么得到 我的需求是做个时间轴要滑动选择不同的时间 开始很难做最后一点一点摸索得出的结论 好在写出来了先 ...

  10. ABC326

    上次说我的写法low的人的AT号在这里!!( 我又来提供 low 算法了. 从 D 开始. T4 我们把 \(\text{A}\) 看成 \(1\),把 \(\text{B}\) 看成 \(2\),把 ...