D3 二维图表的绘制系列(三十二)可缩放的封闭图

D3 二维图表的绘制系列(一)介绍 1 介绍 D3 (或者叫 D3.js )是一个基于 web 标准的 JavaScript 可视化库. D3 可以借助 SVG, Canvas 以及HTML 将你的数据生动的展现出来. D3 结合了强大的可视化交互技术以及数据驱动 DOM 的技术,让你可以借助于现代浏览器的强大功能自由的对数据进行可视化 学习了d3一个多月,通过绘制一些简单的二维图表,总算入门了d3。强烈推荐《D3数据可视化实战... 阅读详情

上一篇: 热力地图

下一篇: 可缩放的矩形树图

代码结构和初始化画布的Chart对象介绍,请先看 这里

本图完整的源码地址: 这里

1 图表效果

在这里插入图片描述

2 数据

这里用的是和普通封闭图一样的数据

{
    "name": "grandfather",
    "children": [
        {
            "name": "father",
            "children": [
                {
                    "name": "son",
                    "children": [
                        {"name": "grandson1", "house": 2},
                        {"name": "grandson2", "house": 3},
                        {"name": "grandson3", "house": 4}

                    ]
                }
            ]
        },
        {
            "name": "mother1",
            "children": [
                {
                    "name": "daughter1",
                    "children": [
                        {"name": "granddaughter1", "house": 4},
                        {"name": "granddaughter2", "house": 2}
                    ]
                },
                {
                    "name": "daughter2",
                    "children": [
                        {"name": "granddaughter3", "house": 4}
                    ]
                }
            ]
        },
        {
            "name": "mother2",
            "children": [
                {
                    "name": "son1",
                    "children": [
                        {"name": "grandson4", "house": 6},
                        {"name": "granddaughter4", "house": 1}
                    ]
                },
                {
                    
                    "name": "son2",
                    "children": [
                        {"name": "granddaughter5", "house": 2},
                        {"name": "grandson5", "house": 3},
                        {"name": "granddaughter5", "house": 2}
                    ]
                    
                }
            ]
        }

    ]
}

3 关键代码

导入数据

	d3.json('./data.json').then(function(data){
	....
	}

数据转换,运用d3.pack添加布局信息,与普通封闭图一致。设置变量focusCircle 和 prevView,其中前者为当前呈现的节点,后者为上一次放缩的节点,这里保留放缩前后节点的数据的意义在于使用interpolateZoom插值数据用于生成过渡动画效果。

/* ----------------------------数据转换------------------------  */
	const root = d3.hierarchy(data)
	                .sum((d) => d.house)
	                .sort((a,b) => a.value - b.value);
	
	const pack = d3.pack()
	                .size([chart.getBodyWidth(), chart.getBodyHeight()])
	
	pack(root);
	
	let focusCircle = root;
	let prevView;

渲染圆圈节点,与普通封闭图相同

/* ----------------------------渲染圆圈------------------------  */
    let groups;
    chart.renderCircle = function(){
        groups = chart.body().selectAll('.g')
                                    .data(root.descendants().slice(1));

        groups.enter()
                .append('g')
                .attr('class', (d, i) => 'g g-' + i)
                .attr('transform', () => 'translate(' + chart.getBodyWidth()/2 + ',' + chart.getBodyHeight()/2 + ')')
                .append('circle')
                .attr('class', 'circle')
            .merge(groups.selectAll('.circle'))
                .attr('fill', (d) => chart._colors(d.depth % 10));

        groups.exit()
                .selectAll('.circle')
                .transition().duration(config.animateDuration)
                .attr('r', 0)
                .remove();
    }

绑定鼠标交互事件,这里点击圆圈节点,使整个节点充满当前视图,点击svg元素,则返回根节点

		d3.selectAll('.g circle')
            .on('mouseover', function(){
                const e = d3.event;
                e.target.style.cursor = 'hand'

                d3.select(e.target)
                    .attr('stroke', config.hoverColor);

            })
            .on('mouseleave', function(d){
                const e = d3.event;

                d3.select(e.target)
                    .attr('stroke', null);
            })
            .on('click', function(d){
                if (focusCircle !== d){
                    zoom(d);
                    d3.event.stopPropagation();
                }
            });

        chart.svg()
                .style("cursor", "poniter")
                .on("click", () => zoom(root));

放缩的关键代码所在,记录当前点击的节点,对缩放进行插值,生成过渡动画。这里的k是比例系数,用于确定放缩的倍数,使整个节点恰好充满视图

function zoom(d){
            focusCircle = d;

            chart.svg()
                    .transition()
                    .duration(config.animateDuration)
                    .tween("zoom", d => {
                        const i = d3.interpolateZoom(prevView, [focusCircle.x, focusCircle.y, focusCircle.r * 2]);
                        return t => zoomTo(i(t));
                    });
        }

        function zoomTo(v){
            const k = chart.getBodyHeight() / v[2];

            prevView = v;

            d3.selectAll("circle")
                .attr("transform", (d) => {
                    return `translate(${(d.x - v[0]) * k},${(d.y - v[1]) * k})`;
                })
                .attr("r", (d) => d.r * k);

            d3.selectAll(".text")
                .attr("transform", (d) => {
                    return `translate(${(d.x - v[0]) * k + chart.getBodyWidth()/2},${(d.y - v[1]) * k  + chart.getBodyHeight()/2}) scale(${k})`;
                })
        }

大功告成!!!


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

D3 force(力导向图)研究之一:完美融合拖拽与缩放 本文采用的d3版本为第四版,4.9.1先看实例效果,见图1, 在对节点进行缩放后,依旧能够做到以下两点: 1. 拖拽依旧能够完美做到鼠标跟随与连接关系跟随; 2. 缩放拖拽后,节点的位置依旧正确,利于数据保存; 再看操作失败的例子,见图2。 对现象进行分析,我们可以发现: 1. 鼠标跟随无差异,拖拽操作正常; 2. 节点位置正常; 3. 连线的更新状态错误;继续诊断,我们可以得出这 阅读详情

相关推荐

【 D3.js 进阶系列 — 3.1 】 圆形分区图

分区图布局的 size 函数很有意思,即可用于制作矩形分区图,也可用于制作圆形分区图。本文就来谈讨一下圆形分区图的制作。

十二月咖啡馆工作室 1万+

d3 如何动态改变比例尺实现缩放功能

【代码】d3 如何动态改变比例尺实现缩放功能。

qq_44930937的博客 1416

d3绘制关系图的缩放功能实现

<!DOCTYPE html> <meta charset="utf-8"> <style>.link { fill: none; stroke: #666; stroke-width: 1.5px;}#licensing { fill: green;}.link.licensing { stroke: green;}.link.resolved { stroke-dasharray: 0,2 1;}circle { fill: #ccc; stroke

weixin_38764818的博客 968

D3 二维图表的绘制系列(十九)封闭图

上一篇: 漏斗图 https://blog.youkuaiyun.com/zjw_python/article/details/98497967 下一篇: 河流图 https://blog.youkuaiyun.com/zjw_python/article/details/98201470 代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article/...

zjw_python的博客 2171

图形学作业(一)基于OpenGL图形的移动和缩放(python)

一、首先,你得先了解OpenGL,要不然很难看懂代码。传送门https://blog.youkuaiyun.com/xufive/article/details/86565130。下载好PyOpenGL的包,准备好对应的whl文件,放入你的python文件下的scripts里,cmd pip install 包名。如果显是already sistisfied 二、图形几何变换,实现键盘控制上下左右移动,鼠标控制大小 三、代码 #coding=utf-8 from OpenGL.GL import * from

weixin_41411978的博客 1043

使用dagre-d3做一个dag图(关系图)

dagre-d3插件github地址:https://github.com/dagrejs/dagre-d3csdn引入:&lt;script src="https://d3js.org/d3.v4.min.js" charset="utf-8"&gt;&lt;/script&gt; &lt;script src="../dist/dagre-d3.js"&gt;&lt;/script&amp

无聊者进来逛逛 4万+

D3 二维图表的绘制系列(十八)漏斗图

上一篇: 树图 https://blog.youkuaiyun.com/zjw_python/article/details/98492510 下一篇: 封闭图 https://blog.youkuaiyun.com/zjw_python/article/details/98201470 代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article/d...

zjw_python的博客 4651

d3 带缩放的折线

d3.js可视化工具 折线图可以鼠标滚动缩放 横坐标为时间

D3实现柱状图

D3是一种数据可视化工具,数据的可视化其实就是把数据以图表等直观的方式展示给用户,让用户更直观的感受到数据的走势和变化。这种应用在项目中越来越多的被使用,话说,千句话不如一张图,说的一点都不为过。那么D3作为这种轻巧免费公开的图表制作工具,在应用中被越来越多的使用。D3有很多让人眼前一亮的功能,现在我们所处理的是一些基本的图表,比如柱状图,饼图,折线图等。 话不多说,这篇博客主要是在项目中用到的

chenqk_123的专栏 5801

【雷达信号处理实战】从原理到代码:脉冲多普勒(PD)处理全流程解析与MATLAB仿真

本文深入解析了脉冲多普勒(PD)雷达信号处理的核心原理与全流程。通过剖析多普勒效应、脉冲压缩与慢时间FFT等关键技术,并结合详细的MATLAB仿真代码,手把手指导如何从信号建模、回波模拟到最终生成距离-多普勒谱,实现运动目标的精确测距与测速,直观展示了相参积累带来的显著性能增益。

pca5navigator的博客 954

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 299

vue中 d3/svg流程图根据窗口缩放,设置动态宽度高度或者样式

在开发过程中,很多时候都会用到动态的计算的样式,比如宽度,高度。特别是开发后台管理系统。 那么首先你务必看Vue的官方文档。涉及到的基础知识有: 绑定内联样式的使用 computed的使用 文档写的都是基础使用。那么在项目实战中如何使用,2步就能实现,下面提供一个参考方案: 需求场景:获取当前元素宽度,设置containerdiv的可滚动区域范围。 1.添加样式绑定 div标签...

晓风揽月 5033

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 138

d3绘制折线图,及自适应问题

1、demo &lt;!DOCTYPE html&gt; &lt;meta charset="utf-8"&gt; &lt;style type="text/css"&gt; /* 13. Basic Styling with CSS */ /* Style the lines by removing the fill and applying a stroke */ .line {...

pgLi 1957

深入解析FOC电流环PI参数整定:从理论到实践

本文深入解析了FOC(磁场定向控制)中电流环PI参数整定的核心原理与实践方法。文章从永磁同步电机模型出发,详细阐述了基于带宽与零极点对消的工程法及考虑逆变器延迟的二阶系统整定法两种经典策略,并提供了从理论计算到安全上电调试的完整步骤与常见问题解决方案,帮助工程师精准调校电机控制性能。

weixin_29164497的博客 449

【AUTOSAR-Nm】-2.2-通过CAN/Lin...信号报告Nm状态机的跳转

如何通过Can/Lin/Fr/Udp/J1939信号,获取每个通道对应状态机的跳转信息:“前一次状态”和“当前状态”。

「汽车电子助手」的博客 2464

D3数据可视化之——拖拽移动和缩放

参考:https://bl.ocks.org/mbostock/3127661b6f13f9316be745e77fdfb084 <!DOCTYPE html> <meta charset="utf-8"> <svg width="960" height="500"></svg> <script src="https://d3js.org/...

yudajiangshan的博客 6710

【报错】ImportError: libpython3.10.so.1.0: cannot open shared object file: No such file or directory

ImportError: libpython3.10.so.1.0: cannot open shared object file: No such file or directory

静谧、淡雅 861

可视化工具–D3–基础图表的绘制(line)

可视化工具--D3--基本图标的绘制(line)

可视化大猩猩 8454

Avalonia+ReactiveUI跨平台路由:从零到舞者,你的UI也能跨界起舞?

至此,你已掌握了Avalonia+ReactiveUI的跨平台路由精髓!你的应用现在能够优雅地在各个界面间穿梭,就像是在不同星球间跳跃的宇宙飞船。无论是初探跨平台开发的新手,还是经验丰富的老船长,这段旅程都能让你的UI编排技能更上一层楼。现在,是时候让世界见证你的跨平台魔术了!💫记住,每一次实践都是向着完美编舞迈进的一步,勇敢地在你的项目中尝试吧!如果在航行中遇到风暴,别忘了回来看看这篇指南,或者在评论区抛出你的救生圈,我们一起解决!🌊。

java专栏 1534

Python 爬虫实战:亚马逊 + eBay 商品信息跨平台抓取(价格 / 销量 / 评价对比)

亚马逊和 eBay 是全球知名的电商平台,拥有海量的商品信息。对于消费者来说,比较不同平台上的商品价格、销量和用户评价可以帮助他们找到性价比最高的商品。对于商家而言,了解竞争对手的商品信息有助于优化自身的产品策略和定价策略。然而,手动在两个平台上逐一比较商品信息是非常耗时且低效的。因此,开发一个能够自动抓取并对比这两个平台商品信息的爬虫工具具有重要的实际意义。

yansideyucsdn的博客 617

D3 二维图表的绘制系列(十七)树图

上一篇: 矩形树图 https://blog.youkuaiyun.com/zjw_python/article/details/98480632 下一篇: 漏斗图 https://blog.youkuaiyun.com/zjw_python/article/details/98201470 代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article...

zjw_python的博客 3849

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

D3利用viewBox属性等比例缩放SVG图像

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33824363的博客 1248

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

D3.js缩放最简单例子,垂直缩放,元素距离缩放,元素大小不变

本例子中使用一个画的像冰糖葫芦的图形来缩放山楂之间以及木棍的距离,而木棍和山楂的大小不变 缩放后   &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;d3OnlyTranslateZoom.html&lt;/

weixin_39703282的博客 3639

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python基本图形绘制

python语言是通用语言:可由于普世的求解问题的开发。强制可读性、较少的底层语法元素、多种编程方式、支持中文字符、语法简洁是C语言代码量的10%、13万的第三方库、快速增长的计算生态、避免重复造轮子、开发共享、跨操作平台、生态高产超级语言:粘性整合已有程序,具备庞大的计算生态编程思维不再是刀耕火种,而是集成开发python蟒蛇绘制问题1:计算机绘图是什么原理?一段程序为何能够产生窗体?为何能在窗...

diyhoo的编程小屋 5万+

数据可视化 - 柱状图 - 横轴放大缩小功能

from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.faker import Faker c = ( Bar() .add_xaxis(Faker.days_attrs) .add_yaxis("商家A", Faker.days_values) .set_global_opts( title_opts=opts.TitleOpts(t...

记录项目交付的日常 1950
上一篇: 高性能Javascript读书总结
下一篇: D3 二维图表的绘制系列(三十三)可缩放的矩形树图
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值