数据可视化【十一】树状图

Constructing a node-link tree visualization

首先将节点之间的连线画出来。
使用json函数读取文件以后,使用hierarchy等函数得到连线的数组,然后绑定这个数组,给每个元素添加一个path,绘画使用的是一个函数linkHorizontal(因为这里是水平的树状图,如果你想绘制垂直的也可以使用linkVertical,需要注意的是,水平的需要交换每个连线的x和y,垂直的不需要)
index.js

json('data.json').then(data =>{const root = hierarchy(data);const links = treeLayout(root).links();const linkPathGenerator = linkHorizontal().x(d => d.y).y(d => d.x)//上面的x和y进行了替换,是因为我们想要绘制水平的树状图,如果使用垂直的,x和y应该是对应的g.selectAll('path').data(links).enter().append('path').attr('d', linkPathGenerator);
}

style.css

path {fill: none;stroke: #f7a4a4;
}

Adding text labels to the nodes

通过root.descendants获得每个节点的位置数组,绑定这个数组以后添加text,同样需要注意水平的xy需要分开。然后使用一些技巧使得文字变得更加好看

const treeLayout = tree().size([Height, Width]);json('data.json').then(data =>{const root = hierarchy(data);const links = treeLayout(root).links();const linkPathGenerator = linkHorizontal().x(d => d.y).y(d => d.x)//上面的x和y进行了替换,是因为我们想要绘制水平的树状图,如果使用垂直的,x和y应该是对应的g.selectAll('path').data(links).enter().append('path').attr('d', linkPathGenerator);g.selectAll('text').data(root.descendants()).enter().append('text').attr('x', d => d.y).attr('y', d => d.x).text(d => d.data.data.id);});

Using the Margin Convention(约定)

为了让文字布局更加好看,我们需要设置Margin来设置边框

const margin = {top:0, right: 70, bottom: 0, left:90};
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;const treeLayout = tree().size([innerHeight, innerWidth]);const zoomG = svg.attr('width', width).attr('height', height).append('g');const g = zoomG.append('g')
.attr('transform',`translate(${margin.left},${margin.top})`);

然后后面都在g上添加元素即可。这里设置了两层g实际上是为了后面放大缩小的时候使用

Tweaking(调整) label alignment(队列) and size

我们还需要设置标签的位置,标签的字体大小:
index.js

g.selectAll('text').data(root.descendants()).enter().append('text').attr('x', d => d.y).attr('y', d => d.x).attr('dy', '0.32em')//使得节点被线从中间穿过.attr('text-anchor', d => d.children ? 'middle' : 'start')//将文字放在中间.attr('font-size', d => 3.2-d.depth + 'em')	//使得文字大小随层数递减.text(d => d.data.data.id);

style.css

text {text-shadow:
/*  给标签添加白色的阴影,这样就不会被线挡住    */-1px -1px 3px white,-1px 1px 3px white,1px -1px 3px white,1px 1px 3px white;pointer-events: none;	
/*   鼠标经过文字的时候不会变成可编辑的样子(因为本来就是不可编辑的) */
}

Panning & Zooming

这个和以前一样,在call函数里面添加zoom函数:
index.js

svg.call(zoom().on('zoom',() =>{zoomG.attr('transform', event.transform);
}));

Curran说弄两层g这样就可以解决放大再缩小以后边框丢失的问题,但是我发现好像并没有什么卵用。。。

Using a custom font

选择一个好看的字体也很重要,首先在Google Fonts里面找到一个喜欢的字体,然后点击select
在这里插入图片描述
然后把link放在html文件里面,后面的字体放在对应的选择器里面就可以了。

效果图:在这里插入图片描述
在这里插入图片描述
代码地址:https://vizhub.com/Edward-Elric233/706152caf5ca4aae992cc371f2d5891a

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

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

相关文章

数据可视化【十二】 颜色图例和尺寸图例

有了前面的知识,制作一个图例应该不是很难,关键是我们想要制作一个可以在其他地方进行使用的图例,这样就需要能够动态地设置图例的大小,位置,等等。 这里直接上代码: colorLegend.js export const color…

数据可视化【十三】地区分布图

在前面的博客中已经介绍了如何绘制地图,这一节学习如何绘制地区分布图。如果对绘制地图还不熟悉的话可以了解一下之前我写的博客:数据可视化【十】绘制地图 Intergrating(整合) TopoJSON with tabular data(列表数据) 在前面的博客中没有使用到tsv文件…

3.01【python正则表达式以及re模块】

python正则表达式以及re模块 元字符 正则表达式的语法就由表格中的元字符组成,一般用于搜索、替换、提取文本数据 元字符含义.匹配除换行符以外的任何单个字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定义字符集&#xff…

Linux配置编程环境+云服务器上传文件

Java环境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_21077715/article/details/85536399 Tomcat配置 Centos https://blog.csdn.net/qq_21077715/article/details/85541685 https://www.cnblogs.com/newwind/p/9904561…

gbd + cgbd

gbd:传送门 cgbd:传送门 | 传送门

数据可视化【十四】交互式过滤地区分布图

在前面的博客中已经介绍了如何绘制地区分布图,这一节学习如何绘制交互式过滤地区分布图。如果对绘制地区分布图还不熟悉的话可以了解一下之前我写的博客:数据可视化【十三】地区分布图 整体的框架仍然是在之前的基础上进行修改,主要是添加交…

Ubuntu环境搭建

本文记录了一些常用的Ubuntu软件 然后首先修改软件源:软件和更新->Ubuntu软件->下载自:其他站点(修改为阿里云) 在关闭的时候需要更新什么的 然后修改更新方式,将不支持的更新去掉 常用的Windows软件 网易云…

1 两数之和

虽然只是一道很简单的题,但是也给我很多思考。 刚看到这道题的时候没有仔细思考,直接写了个排序和二分查找,想着对每个数字查找另一个数字会不会出现,复杂度是O(nlognnlogn)O(nlognnlogn)O(nlognnlogn),主要训练了一下…

834 树中距离之和

这道题我自己的想法只有对每个点都用一遍Dijkstra然后再求和,显然会超时,所以我都没有尝试。 研究了一下题解,发现题解很巧妙,自己对树的处理还是太稚嫩,之前树链剖分学的都忘光了。 对于固定根节点的,我…

75 颜色分类

题目已经提示可以一遍扫描了但是我还是没有想到,其实双指针的想法我已经有了,但是一想到有问题就觉得无法实现。这也揭示了我思维上的问题:用一种方法解决问题遇到困难第一件事情不是想着如何攻克而是想着换一种方法。对自己的思维也不自信。…

141 环形链表

要求使用空间复杂度为O(1)的方法,可是我并没有想到。我想到的只有用一个哈希表记录一下所有访问过的节点。 题解给出的空间复杂度为O(1)的方法是使用两个指针,然后让一个一次跑一步,一个一次跑两步,如果跑的快的能追上跑的慢的就…

数据可视化【十五】

经验法则:在颜色不相邻的时候加上背景颜色颜色的个数为6~12比较好。 颜色其实很大程度上由背景决定而不是他本身决定。 D3 Scale-Chromatic 有许多颜色刻度,可以根据自己的需要进行选择。 参考论文:Practical Rules for Using Color in Cha…

Ubuntu修改/删除主目录下的中文文件夹

在Ubuntu的主目录下一般是有一些中文的目录,例如桌面,视频等等,还无法修改名称,在一群英文文件夹里面显得有些突兀(Ubuntu终端下的中文一点也不好看),就想把这些文件夹修改一下,结果…

19 删除链表的倒数第N个

题目的意思很简单,就是删除一个链表倒数第N个节点。 需要用到链表的标准操作:快慢指针。 我们让一个快指针先指向第N个元素,这个时候快指针总比慢指针领先N个元素,等到快指针指向链表尾部的时候慢指针就指向需要删除的元素。 之前…

844. Backspace String Compare

题目的意思大概是有两个字符串,其中的#表示退格键,让比较最后两个字符串是否相当。 很容易想到的思路就是用一个栈进行模拟这个过程,特别需要注意如果一个串是空串也是可以退格的。 但是很容易想到的另一个特性就是,前面的字符有…

链表三连击

876:链表的中间节点 206:反转链表 143:重排练表 链表的中间节点 这个题一看就是最简单的快慢指针,但是在具体实现的时候我还是犹豫思考了一下:要不要在链表前面放置哑节点,快指针应该什么时候判断已经到达…

D3力导引图

学习力导引图的时候在网上没有找到什么好的教程,支离破碎地进行了一段时间的学习,还阅读了d3的关于d3的官方文档,但是始终觉得不的要领。这里记录一下我学习力导引图的一些心得以及推荐一下学习资源。 学习资源 官方文档:https:…

Ubuntu Pycharm启动后卡住无法操作

昨天还好好的,今天打开Pycham突然卡住了,卡在了那个preparing workspace的地方,然后在网上搜索了很多方法都没用。直到在网上看到有个大佬说是因为搜狗输入法的问题,我才突然记起来昨天安装了搜狗输入法。。。 kill掉卡住的Pycha…

327 区间和的个数

题目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note: A naive algorithm of O(n2) is t…

浏览器访问本地文件

之前一直苦恼无法在浏览器访问本地文件,尤其是写的网页需要调用外部数据的时候,今天学习到可以用python很方便的解决问题 如果有python3环境,直接在对应的文件夹下运行(这里是Ubuntu环境,如果是Windows应该在命令行也…