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

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

上一篇: 漏斗图 https://blog.youkuaiyun.com/zjw_python/article/details/98497967

下一篇: 河流图 https://blog.youkuaiyun.com/zjw_python/article/details/98592543

代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article/details/98182540

本图完整的源码地址: https://github.com/zjw666/D3_demo/tree/master/src/enclosureChart/basicEnclosure

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){
....

一些样式参数配置

const config = {
        margins: {top: 80, left: 80, bottom: 50, right: 80},
        textColor: 'black',
        title: '基本封闭图',
        hoverColor: 'white',
        animateDuration: 1000
    }

数据转换,封闭图与矩形树图、树图等都是具有层次的数据结构,因此需要将原始数据转换一下,转换后,运用d3.pack添加布局信息

/* ----------------------------数据转换------------------------  */
    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);

有了布局信息之后,我们直接就用circle元素渲染一个个圆圈,非常简单

/* ----------------------------渲染圆圈------------------------  */
    chart.renderCircle = function(){
        const groups = chart.body().selectAll('.g')
                                    .data(root.descendants());
                
              groups.enter()
                      .append('g')
                      .attr('class', (d, i) => 'g g-' + i)
                      .append('circle')
                      .attr('class', 'circle')
                    .merge(groups.selectAll('.circle'))
                      .attr('cx', (d) => d.x)
                      .attr('cy', (d) => d.y)
                      .attr('r', (d) => d.r)
                      .attr('fill', (d) => chart._colors(d.depth % 10));
            
              groups.exit()
                      .selectAll('.circle')
                      .transition().duration(config.animateDuration)
                      .attr('r', 0)
                      .remove();     
    }

渲染文本,注意文本长度不要超过圆圈的直径

/* ----------------------------渲染文本标签------------------------  */
    chart.renderText = function(){

        const texts = chart.body().selectAll('.text')
                                    .data(root.descendants());

              texts.enter()
                      .append('text')
                      .attr('class', 'text')
                   .merge(texts)
                      .attr('transform', (d) => 'translate(' + d.x + ',' + d.y + ')' )
                      .text((d) => d.data.name)
                      .attr('stroke', config.textColor)
                      .attr('fill', config.textColor)
                      .attr('text-anchor', 'middle')
                      .text( function(d){
                          if (d.children) return;
                          if (textWidthIsOk(d, this)){
                              return d.data.name;
                          }else{
                              return d.data.name.slice(0,3);
                          }
                        })
        
        // 检测文本长度是否合适
        function textWidthIsOk(d, text){
            const textWidth = text.getBBox().width;
            if (d.r*2 >= textWidth) return true;
            return false;
        }

    }

最后绑定鼠标交互事件,悬停鼠标圆圈变色

/* ----------------------------绑定鼠标交互事件------------------------  */
    chart.addMouseOn = function(){

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

                d3.select(e.target)
                    .attr('fill', config.hoverColor);
                
            })
            .on('mouseleave', function(d){
                const e = d3.event;
                
                d3.select(e.target)
                    .attr('fill', chart._colors(d.depth % 10));
            });
    }

大功告成!!!


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

在这里插入图片描述

MyBatis-Flex分页查询实战:为什么你的_COUNT方法总是报错? 本文深入解析MyBatis-Flex分页查询中常见的_COUNT方法报错问题,揭示其背后的设计机制与实现原理。通过源码分析、错误场景剖析和最佳实践示例,帮助开发者正确使用MyBatis-Flex分页功能,提升查询效率与代码质量。 阅读详情

相关推荐

前端可视化入门与实战:D3 高级图表实战:柱状图、折线图

最后,我们总结下这一节的关键知识点。D3 基于 SVG 的数据驱动视图的库,通过链式调用、封装比例尺、数学方法、数据状态的管理等,我们可以轻松绘制复杂的图表。我们的关注点只在数据,不用深入数据背后的调用,修改数据意味着视图会被更新。定义绘图区域 -> scaleBand 用于离散数据,用在 x 轴的比例尺;在 y 轴我们用scaleLinear,生成比例尺 -> 生成坐标轴 -> 通过 rect 生成柱体。

斌擎科技 2571

D3入门教程——做一个简单的图表

文章目录一、准备1.什么是画布1)SVG2)Canvas3)两者之前的区别二、开始1.添加画布2.绘制矩形三、完整代码 一、准备 1.什么是画布 HTML 5 提供两种强有力的“画布”:SVG 和 Canvas。 1)SVG SVG 是一种使用 XML 描述 2D 图形的语言。 SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事...

苏木的小站 3953

D3.js图表项目实战:从数据到地图和条形图的可视化

视觉上的吸引力对于信息的传达至关重要。我们可以通过自定义样式来增强地图的视觉效果。D3.js利用CSS和SVG的属性来实现这一点。我们已经讨论了如何通过样式和交互性来提升地图的表现力。从数据驱动的颜色渐变到对鼠标悬停和点击事件的响应,再到动态的过渡效果和地图的交互操作,每一步都是为了让地图不仅仅是一个静态的信息展示,而是一个可以与之互动,探索数据背后故事的工具。在下一章,我们将深入探讨如何使用D3.js构建条形图,包括数据的加载、尺度计算、轴生成以及条形的创建。

weixin_42592399的博客 1081

D3基本图表绘制——折线图

制作折线图分成4步走: 1.首先划定制图区域和范围——画一个边框 2.数据处理得到绘制折线图需要的数据——绘制折线需要一个数组整体 3.画出x,y轴和折线——y轴绘制需要注意 4.补充标签,调节位置

m0_63150077的博客 5329

Windows10 使用Apple Studio Display显示器的设置

AppleStudioDisplay显示器购买花了近1.5wRMB,由于为windows台式机,显卡为NVIDAGTX-1660,而AppleStudioDisplay只有雷电接口,尝试了很多种转接方式,均以失败告终,最终使用贝尔金VR线成功,,附图如下这边也测试过NVIDARTX-2060Super、NVIDAGTX-1650显卡,都是能点亮的,NVIDA1650存在关机重启后黑屏,不稳定现象,2060也存在关机重启后不亮现象,后面发现1660s很稳定。...

爱意随风起,人生不可弃。 1万+

从开通VPS到搭建宝塔面板全教程

你在输入域名(此时我们可能没有类似aaa.com这样的域名,所以要输入VPS的IP地址)的时候,下面的根目录也会跟着变动,等输入完成后,你可以把根目录再改回成/www/wwwroot/dq。这时,在你的浏览器中,输入外网面板地址的URL,输入username和password,即可登陆宝塔面板。第一次登陆,需要绑定你的宝塔账号,你可以到宝塔的注册界面,用手机注册一个,然后绑定,首先看一下你的VPS操作系统是什么类型的(其实你在选择VPS的时候,就已经选定了,我选择的事Centos系统)。

kxltsuperr的专栏 3734

「数据可视化 D3系列」入门第五章:绘制第一个D3图表

本章将通过创建基础柱状图,一起来体验D3数据可视化的完整流程。以下是我们将构建的图表效果:

XH_jing的博客 1254

EDEM基础操作指南

EDEM(Enhanced Discrete Element Method)是一种用于模拟颗粒物料行为的软件工具。它可以模拟颗粒的碰撞、流动、堆积等过程,广泛应用于颗粒物料工程、振动筛分、堆垛机械、矿山开采等领域。本文将介绍EDEM的基础操作步骤,并提供相应的源代码示例。以上是EDEM的基础操作步骤。通过创建EDEM项目、定义颗粒材料、导入几何模型、设置边界条件、创建颗粒流场和运行模拟,您可以开始模拟颗粒物料的行为并进行相应的分析和优化。请根据您的具体需求和场景进行相应的参数设置和功能调用。

TrDelphi的博客 5293

【D3.js开发入门:绘制图表】静态图表

什么是 D3.js? D3.js是用于 HTML 和 SVG 实现的 JavaScript 可视化库。基于数据操作文档的 JavaScript 库。 说到D3不得不提到Echarts,Echarts和D3都是一个数据可视化的工具;而且都能实现一些相同的可视化图效果;那他们有什么不同呢?区别还是很大的 库层面的不同: 1 D3使用svg绘制图形,echarts使用canvas绘制图形 2 D3代码自由度高,相当灵活,但是学习成本也大;相反echarts封...

popstarqq的博客 1858

永不消逝的电波 -GSM空口信号的接收与解码

一开始接触软件无线电应该是从很早之前对RFID洗衣卡的解密开始的,后来接触人员定位,慢慢的打开了这样一扇大门。。。。 翻到之前做的GSM信号的接收解码,今天就对其过程做一个记录,也不是什么新颖的内容,权当是记录和回忆了。 对于GSM网络的相关内容,不是非常的熟悉,如有不正确的,欢迎批评指正。

Jack.Xu 专栏 1万+

我装了10个ClawHub技能,这些最好用!

ClawHub就是Clawdbot的"应用商店"。Clawdbot是手机ClawHub是App Store技能就是各种App装了技能,Clawdbot才能干更多事。这个技能解决了我的信息过载问题。为什么装我订阅了很多Newsletter。每天收到一堆长文章,根本看不完。怎么用“总结这篇文章的核心观点”“把这个Newsletter提炼成3个要点”“这篇技术博客有哪些可以实践的建议?安装命令真实体验现在我收到长文章,直接转发给Clawdbot。它会提炼出核心要点和行动清单。

Maynor的博客 6101

【d3】d3画图样式图例

以下d3的chart都是本人实践画过的,当然也花费了很多时间和精力,如有需要可以私信我要源码。 一 简单拟合 大体数据格式,后台计算拟合曲线返回formula,前端画图 二 box plot 计算出关键参数,画图 三 椭圆图 此图的画法,其实并不是直接给出的椭圆的关键参数画的。再后台计算椭圆数据时,采用的某个api返回的值是椭圆上的点,因此在前端直接显示的这些点,只要数量够,直观显示的就是椭圆形状。可以看出上图的椭圆中间曲线是空的 四 mosic plot ..

你的博客 7740

【使用FPGA实现MIPI DSI接口】——如何使用FPGA实现MIPI DSI接口?这是一个让许多开发者都感到困扰的问题。本文将介绍如何使用FPGA设计和实现...

【使用FPGA实现MIPI DSI接口】——如何使用FPGA实现MIPI DSI接口?MIPI DSI(移动产业处理器接口 - 显示串行接口)是一种用于在移动设备中传输视频数据的标准接口,它是目前大部分智能手机和平板电脑所采用的显示接口。首先,我们需要实现MIPI DSI的物理层接口。在实现MIPI DSI接口后,我们还需要编写驱动程序来控制MIPI DSI显示屏显示图像。这里只是提供了MIPI DSI接口的物理层代码示例,完整的MIPI DSI接口实现需要包括控制器和驱动程序等更多内容。

uote_e的博客 1998

数据可视化 D3.js 图表的绘制(一)做一张简单的图表

画布   绘图的前提是有一张画布,HTML 5 提供两种强有力的“画布”:SVG 和 Canvas。 SVG   SVG,指可缩放矢量图形(Scalable Vector Graphics),是用于描述二维矢量图形的一种图形格式,是由万维网联盟制定的开放标准。   SVG 使用 XML 格式来定义图形,除了 IE8 之前的版本外,绝大部分浏览器都支持 SVG, 可将 SVG 文本直接嵌入 HTML...

一只菜鸡 3220

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

本文介绍了WinForm开发中OpenFileDialog控件的关键属性及其应用。OpenFileDialog是.NET Framework提供的文件对话框控件,主要用于选择、打开文件操作。文章详细讲解了11个核心属性:AddExtension(自动补全扩展名)、AutoUpgradeEnabled(外观升级)、CheckFileExists/CheckPathExists(文件/路径存在验证)、DefaultExt(默认扩展名)、DereferenceLinks(解析快捷方式)、FileName/File

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1534

〖Python WEB 自动化测试实战篇⑤〗- selenium 元素定位详解 - (八大元素定位方式)

测试对象的定位和操作是我们利用 selenium 编写自动化脚本和 webdriver 的核心内容,其中 "操作" 这一部分又是建立在 "selenium" 元素定位的基础之上的。所以对元素对象的定位就显得越发的重要,接下来我们就学习一下常用的元素定位方法有哪些。......

易编橙 · 终身成长社群,相遇已是上上签! 4万+

可视化工具D3教程

可视化工具D3教程第1章 D3简介第2章 第一个程序 Hello World第3章 正式进入D3的世界第4章 选择、插入、删除元素第5章 做一个简单的图表第6章 比例尺的使用第7章 坐标轴第8章 完整的柱形图第9章 让图表动起来第10章 理解 update()、enter()、exit()第11章 交互式操作第12章 布局第13章 饼状图第14章 力导向图第15章 树状图第16章 地图可视化学习D......

Blog | Laulliam 7万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

可视化图表 Highcharts、Echarts、D3、该用哪个

除此之外,D3图表类型非常丰富,几乎可以满足所有开发需求,但代码相对于以上两个插件来说,会稍微难一点。以单个文件的形式独立存在,后缀名为.svg,可以在html文件中以img标签的src,元素背景,框架等引入 或者 直接在html文件中引入SVG标签。Highcharts 兼容 IE6 及以上的所有主流浏览器,支持移动端缩放、手势操作。Echarts 兼容 IE6 及以上的所有主流浏览器,支持移动端的缩放和手势操作。D3 兼容IE9 及以上的所有主流浏览器,支持移动端的缩放和手势操作。

webxscan.com 554

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

前端使用d3.js来绘制图表

D3.js 是一个用于创建数据驱动的文档的 JavaScript 库。它提供了一组易于使用的 API,可以帮助开发者快速创建各种类型的图表和可视化效果。D3.js 的主要特点是使用数据驱动的文档,这意味着您可以使用任何格式的数据来创建可视化效果,包括 CSV、JSON、XML 等,你可以通过自定义 HTML、CSS 和 JavaScript 来实现复杂的图形和交互效果。当然ECharts 也不错选择哪种工具取决于具体的需求和项目。如果需要更多的定制性和灵活性,可以选择 D3.js;

weixin_43578304的博客 1867

如何使用数据可视化库 D3 绘制折线统计图

如题,如何使用数据可视化库 D3 绘制折线统计图?这篇文章将通过实例来讲解如何一步一步绘制下面这样一个折线统计图,并带有鼠标悬浮移动的文字显示效果。首先,我们来看下什么是 d3?移步官网:https://d3js.orgD3(或D3.js)是一个用于可视化数据的免费开源JavaScript库。其基于web标准的低级别方法在创作动态、数据驱动的图形方面提供了无与伦比的灵活性。 十多年来,D3为开创性...

太空编程 1850

【数据可视化】【1】手把手教你使用d3.js绘制折线图

借助于强大的d3.js实现折线图的绘制,涵盖了数据可视化的基本概念及d3库的使用技巧。本文分享了绘制折线图的步骤,包括数据准备、轴的添加以及样式的调整。通过本文,读者可以快速了解在web开发中如何借助三方库绘制折线图。

C++程序猿 3839

D3(三)

呜呜呜

chili_fan的博客 547

D3入门学习

D3是一个数据可视化工具,都说挺好。但是我个人这两天的体验来看,D3想要入门不是太简单,至少至少都要有HTML和JavaScript基础才行,对JavaScript的DOM要求也有点高。 其实网上也能找到很多学习资源。下面是我搜集的一些教程: D3呢就是一个js库,使用它主要是用来做数据可视化的,官网上有很多酷炫的例子。 D3的官网我最近学习的教程: 慕课网:使用D3制作图表 极客学院:D

MayMayJn的博客 1万+

数据可视化 D3 图表的绘制(三)添加坐标轴

坐标轴 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv=...

一只菜鸡 1929

使用D3制作统计图表、线性图表、水平柱状图表、饼图 -- (一)线性图表

index.html(图表页面)     D3     index.js(JS代码) var data = [0,34.45,45.534,556,76,87,234,234] generateLineChart(data,"#container",800,250,"时间(天)","销售总价(¥)","svg_price","g_pric

后端研发工程师Marion的博客 2130
上一篇: D3 二维图表的绘制系列(十八)漏斗图
下一篇: D3 二维图表的绘制系列(二十)河流图
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值