news 2026/5/6 5:35:29

D3.js 分组条形图动态更新的艺术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
D3.js 分组条形图动态更新的艺术

在数据可视化领域,D3.js 无疑是创建动态、交互式图表的强大工具。今天,我们将探讨如何使用 D3.js 创建一个动态更新的分组条形图,并解决常见的问题,如旧数据的堆叠和新数据的显示。

问题背景

假设我们有两个不同的测试结果数据集,分别存储在bardisect_01.csvbardisect_02.csv中。我们希望通过一个下拉菜单让用户在两个数据集之间切换,每次切换时图表能够平滑地更新而不是叠加新的条形图。

解决方案

1. 数据加载与预处理

首先,我们需要加载数据,并进行预处理以便于后续的图表绘制:

functionupdate(test_no){d3.csv(`bardisect_${test_no}.csv`).then(function(data){letsubgroups=data.columns.slice(1);letgroups=data.map(d=>d.groups);// ... 后续代码});}

2. 初始化 SVG 画布

初始化 SVG 画布,并设置必要的尺寸和边距:

constmargin={top:10,right:30,bottom:20,left:50},width=460-margin.left-margin.right,height=400-margin.top-margin.bottom;letsvg=d3.select("#my_dataviz").append("svg").attr("width",width+margin.left+margin.right).attr("height",height+margin.top+margin.bottom).append("g").attr("transform",`translate(${margin.left},${margin.top})`);

3. 设置轴和颜色

为分组条形图设置 X 轴、Y 轴和颜色:

letx=d3.scaleBand().domain(groups).range([0,width]).padding([0.2]);letxSubgroup=d3.scaleBand().domain(subgroups).range([0,x.bandwidth()]).padding([0.05]);lety=d3.scaleLinear().domain([0,100]).range([height,0]);letcolor=d3.scaleOrdinal().domain(subgroups).range(['green','red','grey']);

4. 绘制条形图

关键在于如何处理数据的更新。使用datajoin方法来处理数据的进入、更新和退出:

svg.selectAll("g.my-x-axis").data([null]).join('g').attr("class","my-x-axis").attr("transform",`translate(0,${height})`).call(d3.axisBottom(x).tickSize(0));letbars=svg.selectAll(".bar-group").data(data);bars.exit().remove();// 移除旧的条形bars.enter().append("g").attr("class","bar-group").attr("transform",d=>`translate(${x(d.groups)}, 0)`).selectAll("rect").data(d=>subgroups.map(function(key){return{key:key,value:d[key]};})).join((enter)=>{enter.append("rect").attr("x",d=>xSubgroup(d.key)).attr("y",d=>y(d.value)).attr("width",xSubgroup.bandwidth()).attr("height",d=>height-y(d.value)).attr("fill",d=>color(d.key));},(update)=>{update.transition().duration(1000).attr("y",d=>y(d.value)).attr("height",d=>height-y(d.value)).attr("fill",d=>color(d.key));});

5. 事件处理

为下拉菜单添加事件处理器:

letselect=d3.select('#test_no');select.on('change',function(){update(this.value);});

结论

通过上述代码,我们实现了一个动态更新的分组条形图。每次选择新的数据集时,图表会平滑地过渡到新的数据状态,避免了条形图的堆叠问题。这样的实现不仅提高了用户体验,还展示了 D3.js 在处理动态数据时的强大能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 5:34:36

八大网盘直链下载神器:LinkSwift带你突破下载速度限制

八大网盘直链下载神器:LinkSwift带你突破下载速度限制 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…

作者头像 李华
网站建设 2026/5/6 5:33:31

机器人关节驱动方案:DRV8243与MPQ4436选型实测

【引言/痛点】协作机器人对关节驱动模组提出了矛盾的要求:既要足够扭矩实现负载搬运,又要体积紧凑便于集成到机械臂内部。传统伺服驱动器体积庞大,不适用于6轴协作机器人的关节空间。集成化驱动方案成为必然选择,但芯片级集成带来…

作者头像 李华
网站建设 2026/5/6 5:32:39

VTAM视频时序预测模型:原理、优化与工业实践

1. 项目背景与核心价值视频时序预测是计算机视觉领域的前沿方向之一,VTAM(Video Temporal Attention Model)作为该领域的代表性模型,通过引入注意力机制实现了对长序列视频帧间关系的精准建模。我在实际工业级视频分析项目中验证发…

作者头像 李华
网站建设 2026/5/6 5:30:38

若依微服务 Kubernetes 部署笔记( Node1 故障修复版)

若依微服务 Kubernetes 部署笔记(含 Node1 故障修复版)1. 环境信息OS: Ubuntu 22.04 LTSK8s: v1.28.2容器运行时: containerd v2.2.1(已配置 systemd cgroup 阿里云 pause 镜像)网络插件: Flannel节点列表名称主机名IPMasterk8s-…

作者头像 李华
网站建设 2026/5/6 5:30:29

太阳能MPPT转换器设计与工程实践详解

1. 太阳能MPPT转换器设计背景在偏远地区的电子设备供电场景中,太阳能电池板因其清洁、可再生的特性成为理想选择。但光伏发电存在一个核心挑战:其输出功率会随着光照强度和环境温度的变化而剧烈波动。我曾参与过一个森林防火监控项目,设备经常…

作者头像 李华
网站建设 2026/5/6 5:29:31

构建软件供应链安全测试场:以攻促防的依赖项漏洞演练实践

1. 项目概述:一个“雷区”的诞生与价值最近在GitHub上看到一个挺有意思的项目,叫bomfather/minefield。光看名字,你可能会联想到扫雷游戏,或者某种充满风险的测试环境。没错,这个项目确实和“雷”有关,但它…

作者头像 李华