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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最新可视化大屏模板是用于展示数据和信息的一种页面布局模板。这些模板通常使用HTML技术来构建,并且具有现代化的设计和交互效果。以下是20种最新可视化大屏模板的简要描述。 1. 仪表盘模板:以简洁的方式呈现各种指标和数据的模板,适用于监控和分析数据。 2. 地图模板:通过地图可视化展示数据的分布和相关信息,可用于区域分析和地理数据可视化。 3. 报表模板:提供多种报表样式,可展示各种数据指标和趋势,适用于数据分析和演示。 4. 进度条模板:以进度条形式展示完成情况和进度,适用于项目管理和进度监控。 5. 雷达图模板:以雷达图形式表达多维数据,适用于比较多个数据维度的差异。 6. 柱状图模板:以柱状图形式展示数据的数量或者比例,适用于比较不同项目或分类的数据。 7. 折线图模板:以折线图形式展示数据的变化趋势,适用于时间序列数据的分析。 8. 饼图模板:以饼图形式展示数据的占比,适用于比较各个部分的相对大小。 9. 漏斗图模板:以漏斗图形式展示数据的流失或者筛选过程,适用于分析渠道转化。 10. 热力图模板:以热力图形式展示数据的热度分布,适用于地理热点和热度分析。 11. 散点图模板:以散点图形式展示数据的分布和相关性,适用于寻找数据的关联性。 12. 树状图模板:以树状图形式展示数据的层级和关系,适用于组织结构和分类关系的展示。 13. 仪表板模板:提供多种数据展示和交互方式,适用于综合数据分析和监控。 14. 时间轴模板:以时间轴形式展示数据的变化过程,适用于时间维度的数据分析。 15. 网络图模板:以网络图形式展示多个节点之间的关系和连接,适用于网络拓扑分析。 16. 关系图模板:以图形方式展示多个实体之间的关系网络,适用于关系分析和社交网络分析。 17. 三维图模板:提供三维视角展示数据的模板,适用于更直观的数据分析和展示。 18. 金字塔模板:以金字塔形式展示数据的层级和大小关系,适用于渐进式筛选分析。 19. 活动图模板:以活动图形式展示流程和活动的关系,适用于流程分析和设计。 20. 标签云模板:以标签云形式展示关键词的重要性和相关性,适用于文本分析和关键词提取。 以上是20种最新可视化大屏模板的简要描述,每种模板都有不同的用途和特点,能够帮助用户更好地展示和分析数据。用户可根据具体需求选择适合自己的模板,以达到最佳的数据可视化效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值