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

3D 锥形图表echarts let loadingFunnel = () => { //title标示文字,标示线 loadingFunnel.title = (text, top, left, color, fontStyle, fontFamily, fontSize) => { return { text: text, ... 阅读详情

上一篇: 树图 https://blog.youkuaiyun.com/zjw_python/article/details/98492510

下一篇: 封闭图 https://blog.youkuaiyun.com/zjw_python/article/details/98591118

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

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

1 图表效果

在这里插入图片描述

2 数据

action,number
访问,60
咨询,40
订单,20
点击,80
展现,100

3 关键代码

导入数据

d3.csv('./data.csv', function(d){
    return {
        action: d.action,
        number: +d.number
    };
}).then(function(data){
....

一些样式配置参数,例如梯形间距等

const config = {
        margins: {top: 80, left: 80, bottom: 50, right: 80},
        textColor: 'black',
        title: '基础漏斗图',
        animateDuration: 1000,
        trapezoidPadding: 3,
        hoverColor: 'white',
    }

尺度转换,这里根据数据数值大小来决定漏斗图梯形的宽度

/* ----------------------------尺度转换------------------------  */
    chart.scale = d3.scaleLinear()
                        .domain([0, d3.max(data, (d) => d.number)])
                        .range([0, chart.getBodyWidth()*0.8]);

处理数据,转换数据结构,方便绘制

/* ----------------------------数据处理------------------------  */
    const handleData = data.sort((a,b) => b.number - a.number).map(
        (d,i,array) => {
            if (i !== array.length-1){
                d.nextNum = array[i+1].number;
            }else{
                d.nextNum = 0;
            }
            return d;
        }
    );

漏斗图可以看作由一个个梯形组成,也就是多边形,因此我们可以使用polygon元素来绘制漏斗图

/* ----------------------------渲染梯形------------------------  */
    chart.renderTrapezoid = function(){

        let trapezoids = chart.body()
                                .append('g')
                                .attr('class', 'traps')
                                .attr('transform', 'translate(' + chart.getBodyWidth()/2 + ',0)')
                                .selectAll('.trap')
                                .data(handleData);
            
            trapezoids.enter()
                        .append('polygon')
                        .attr('class', (d,i) => 'trap + trap-' + i)
                      .merge(trapezoids)
                        .attr('points', (d) => getPoints(chart.scale(d.number), chart.scale(d.nextNum), trapezoidsHeight))
                        .attr('transform', (d,i) => 'translate(0,' + i*(config.trapezoidPadding + trapezoidsHeight) + ')')
                        .attr('fill', (d,i) => chart._colors(i))

            trapezoids.exit()
                        .remove();
                                          

        //计算梯形的点坐标
        function getPoints(topWidth, bottomWidth, height){
            const points = [];

            points.push(-topWidth/2 + ',' + 0);
            points.push(topWidth/2 + ',' + 0);

            if (bottomWidth === 0){
                points.push(0 + ',' + height);
            }else{
                points.push(bottomWidth/2 + ',' + height);
                points.push(-bottomWidth/2 + ',' + height);
            }
            
            return points.join(" ");
        }
    }

在梯形的中心点渲染文本标签

/* ----------------------------渲染文本标签------------------------  */
    chart.renderText = function(){
        let texts = d3.select('.traps')
                            .selectAll('.label')
                            .data(handleData);
            
              texts.enter()
                     .append('text')
                     .attr('class','label')
                   .merge(texts)
                     .text((d) => d.action)
                     .attr('text-anchor', 'middle')
                     .attr('x', 0)
                     .attr('y', (d,i) => i * (config.trapezoidPadding + trapezoidsHeight) + trapezoidsHeight/2)
                     .attr('stroke', config.textColor);

              texts.exit()
                     .remove();
    }

最后绑定鼠标交互事件,鼠标悬停在梯形时,梯形颜色改变

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

        d3.selectAll('.trap')
            .on('mouseover', function(){
                const e = d3.event;

                d3.select(e.target)
                    .attr('fill', config.hoverColor);
            })
            .on('mouseleave', function(d,i){
                const e = d3.event;

                d3.select(e.target)
                    .attr('fill', chart._colors(i));
            })
    }

大功告成!!!


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

在这里插入图片描述

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

相关推荐

韦恩图、漏斗图、桑基图、关系图【html/echarts/d3】

1、韦恩图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>D3韦恩图</title> <style> body { font-size: 16px; font-family: "Helvetica Neue", Helvetica, Arial

weixin_44727274的博客 5849

vue中引入highcharts渲染3d漏斗图

【代码】vue中引入highcharts渲染3d漏斗图。

少油少盐不要辣 3664

Echarts 图表绘制:漏斗图

本文介绍了Echarts漏斗图的核心概念与实用配置方法。漏斗图通过梯形堆叠形态直观展示数据流转与转化过程,适用于销售转化、用户行为分析等场景。文章详细讲解了漏斗图的5步配置流程,包括引入库、创建容器、初始化实例、配置参数和渲染图表,并提供了基础版和实用版的代码示例。实用版示例包含转化率标签、渐变颜色等高级功能,可直接复制使用。漏斗图的优势在于能快速识别流失环节,评估转化效率,并通过自定义样式适配不同业务需求。

梁辰兴的博客 4835

js3d四边金字塔

领导要求在页面总览中心放个3d金字塔图形展示五个层级数据,给我看了下图,大概这个样子: 然而翻完echarts的我发现问题没这么简单,echarts只有2d漏斗图,明显跟领导要求的不一样.于是我搜哪个能做3d金字塔的图,查到了: emmmm…这是3d金字塔??我读书少你不要骗我…话说你这title都写的3d漏斗图是怎么回事… 于是我上网查了下埃及金字塔到底什么样: 我没有理解错,那既然没有现成的,只能手写了,于是网上搜了下js3d金字塔,果然发现了先行者:原生JS实现立体金字塔 但是发现一个问题,这金

weixin_42253577的博客 2133

d3-funnel:一个JavaScript库,用于使用D3.js框架呈现漏斗图

d3漏斗 d3-funnel是可扩展的开放源代码JavaScript库,用于使用库呈现漏斗图。 d3-funnel致力于通过各种自定义选项提供实用且视觉上引人入胜的渠道。 请查看,以展示几种可能的选项。 安装 要安装此库,只需同时包含和D3Funnel: < script src =" /path/to/d3.v4.js " > </ script > < script src =" /path/to/dist/d3-funnel.js " > </ script > 或者,如果您使用的是Webpack或Browserify,则可以安装npm软件包并import该模块。 这将包括一个兼容的D3.js版本: npm install d3-funnel --save import D3Funnel from &#39;d3-funnel&#39; ; 用法 要使用此库,必须创建一个容器元素并实例化一

vue-funnel-graph-js-Vue.js的漏斗图绘制库。 创建垂直和水平的SVG动画漏斗图,并添加标签,值,图例和其他信息。-Vue.js开发

VueFunnelGraph.js Vue.js的漏斗图绘制库。 SVG图表值,标签,百分比显示二维图支持图例显示VueFunnelGraph.js漏斗图绘制库,用于Vue.js。 SVG图表值,标签,百分比显示二维图形支持图例显示悬停时的详细百分比细分动画实色和渐变填充水平和垂直图表这是FunnelGraph.js的Vue.js版本,了解有关该库的更多信息并查看文档这里。 在线演示演示CodePen演示开发演示克隆仓库导航到src文件夹运行vue serve example.vue访问

JS,统计图表大全--十、漏斗图Funnel

十、漏斗图Funnel option = { title: { text: '漏斗图', subtext: '纯属虚构' }, tooltip: { trigger: 'item', formatter: "{a} <br/>{b} : {c}%" }, toolbox: { ...

懒虫的博客 1846

fun_el:基于 D3 的漏斗图

fun_el 基于 D3 的漏斗图 此漏斗图利用条形图和其他形状来表示从流程的一个阶段到另一个阶段的值变化。 条形值表示每个阶段的项目数,指向下一阶段的箭头中的值表示进入下一阶段的整体百分比。

【亲测免费】 推荐开源项目:Funnel.js - 精致的JavaScript漏斗图库

推荐开源项目:Funnel.js - 精致的JavaScript漏斗图库 在数据可视化的世界中,漏斗图是一种常用于展示业务流程或转化率的有效工具。今天,我们向您推荐一款基于D3和Backbone.js编写的全HTML Divs实现的JavaScript库——Funnel.js。它提供了灵活的配置选项和出色的性能,让创建美观的漏斗图变得简单易行。 项目介绍 Funnel.js是一个轻量级的库,它的目...

gitblog_00041的博客 597

【Mac+CLion+STM32+JLink】从零到一:在macOS上构建高效STM32开发与调试工作流

本文详细介绍了在macOS上使用CLion、STM32CubeMX和JLink搭建高效STM32开发与调试工作流的完整指南。从环境准备、CLion深度配置到STM32CubeMX工程实战,再到JLink烧录避坑和串口调试技巧,帮助开发者快速掌握Mac平台下的嵌入式开发全流程。

weixin_28278377的博客 254

Typora绘制思维导图

我们观察一下,其实思维导图就是树状结构的数据嘛,作为程序员,拿语言写树状结构的数据是很平常的事情。而且写代码可比画图省事多了,查阅资料可以知道,有一种`mermaid`语法,就是做这件事情的,支持 UML,甘特图,流程图等。

Peter Cheung的博客 7933

d3-funnel:基于D3.js的漏斗图渲染库教程

d3-funnel:基于D3.js的漏斗图渲染库教程 1. 项目目录结构及介绍 d3-funnel 的仓库组织清晰,便于开发者快速上手。以下是主要的目录结构及其简要说明: d3-funnel │ ├── babelrc # Babel 配置文件,用于编译ES6+代码到浏览器兼容版本 │ ├── browserslistrc # 指定支持的浏览器范围 │ ├── edi...

gitblog_00066的博客 510

ElasticSearch读写性能调优

深层次理解,虽然是每隔一秒就会将内存中的segment数据刷新到segment file中,但实际上这里并没有直接到磁盘文件,而是先写入到OS Cache中。以refresh_interval为间隔时间,将保存在ES 内存缓存区中的数据 刷新到 os的文件系统缓存中,定期清空es的buffer,生成segment。注意:ES 的默认设置,已经综合考虑了数据可靠性,搜索的实时性,写入速度,一般不要盲目修改。将segment刷新到os cache中,并开放了查询权限,以提升搜索的实时性。

qq_44027353的博客 1811

【亲测免费】 探索d3-funnel:高效、灵活的漏斗图生成工具

探索d3-funnel:高效、灵活的漏斗图生成工具 在数据可视化的世界中,漏斗图是一种强大的工具,用于展示流程中的各个阶段及其转化率。今天,我们将深入了解一个开源的JavaScript库——d3-funnel,它基于D3.js,旨在提供直观且高度可定制的漏斗图解决方案。 项目介绍 d3-funnel是一个开源的JavaScript库,专门用于生成漏斗图。它利用了强大的D3.js库,提供了丰富的自定...

gitblog_00189的博客 748

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4489

概率论—期末复习速成笔记(自用)

概率论期末复习

a200327的博客 2万+

5分钟上手c3.js漏斗图:零代码实现转化漏斗可视化终极指南

想要快速实现**转化漏斗可视化**却苦于编程门槛?**c3.js**这款基于D3.js的可重用图表库,让**漏斗图**制作变得前所未有的简单!作为一款功能强大的**数据可视化**工具,c3.js通过简单的API调用就能创建各种交互式图表,包括我们最需要的漏斗图。 ## 🎯 什么是c3.js漏斗图? **c3.js漏斗图**是一种直观展示业务流程转化率的图表形式,特别适合分析用户行为路径、营销

gitblog_00632的博客 1012

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

Js + echarts 漏斗图

var drawFunnelChart=function(chartId,titleText, dataArr,nameArr,gapArr,minValue){ var option = { title: { text: titleText, subtext: '' }, tooltip: { ...

weixin_30887919的博客 868

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 122

深入解析ZYNQ PL触发PS中断:从原理到创新实践

通过本文,您不仅学会了ZYNQ PL-PS中断的基础实现,更掌握了动态优先级调整中断负载均衡等创新技术。响应延迟降低40%以上系统吞吐量提升2-3倍功耗降低30%支持更复杂的实时应用硬件是身体的骨骼,软件是流动的血液,而中断则是连接二者的神经系统。只有精确控制每一条神经冲动,才能构建真正智能的嵌入式系统。拓展思考如何将AI决策引入中断调度?能否实现跨芯片中断同步?量子计算对中断架构的挑战?

QQ_778132974的博客 417

使用D3制作图表(一)

D3,github开源,代码由javascript编写,目的是数据可视化 1.画布制作      线形图表     web容器---生成曲线--生成xy轴和标签 index.html style.css #container{ background: #ddd; width: 500px; height

965

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

vue + echarts 漏斗图 实现里面数据 外面标签 漏斗不随值改变而变形

最近有一个需求漏斗统计,采用的echarts来实现需要实现如下效果 旁边有描述,里面要有值,值的改变不会导致漏斗变形;第一步 首先在项目里安装echarts;echarts官网地址第二步 在 main.js 里面引入echarts(可以按需引入,这里就不做按需引入); 第三部 在相关页面中使用echarts; 实现这个功能实际上是 套了两层数据,如果有更好的方法,可以留言又是漏斗,昨天实现完这个功能后发现了一个问题,如果数值小的情况下,或者相等;漏斗图就会改变,...............

想名字想老半天的博客 7328

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

可视化图表:漏斗图,分析转化率的时候最常用。

漏斗图是一种可视化工具,用于展示数据的层级关系和变化趋势。它由一系列水平条形组成,每个条形的宽度逐渐减小,呈现出漏斗的形状。漏斗图通常用于分析和比较不同层级的数据,例如销售渠道的转化率、招聘流程的候选人筛选等。漏斗图可以帮助我们更好地理解数据的流程和变化情况,以便进行数据分析和决策。漏斗图由一系列水平条形组成,每个条形的宽度逐渐减小,呈现出漏斗的形状。漏斗图通常由多个层级组成,每个层级代表数据的不同阶段或类别。例如,销售渠道的漏斗图可以包括潜在客户、意向客户、成交客户等不同层级。漏斗的条形。

2401_82881178的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

基于echarts 数据可视化大屏展示全国热点分布高亮地图特效

前言???? 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,,基于html+css+javascript+echarts制作, 可以在此基础上重新开发。本项目中使用的是echarts图表库,ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,...

qq_365392777 2973

带你入门three.js——从0到1实现一个3d可视化地图

前言 终于到周末了,前几篇的文章一直给大家介绍2d,canvas 和svg的一些东西。7月份我打算输出3篇万字长文带大家系统地学习可视化表达的3种方式,svg、canvas、webgl。所以这是第一篇文章3d的。 读完本篇文章,你可以学到什么 对于three.js 这个框架有一个简单的理解,可以入门下。学习three中的Raycaster,主要是用鼠标来判断当前选择的是哪一个物体。我用一个简单的实例 带大家用three实现简单的可视化地球案例 。 3d框架的选择——three.js 1.为什么选择thre

suandfei的博客 5809
上一篇: 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、付费专栏及课程。

余额充值