D3.js SVG绘图实践:趋势缩略图

PBI中使用SVG自定义折线缩略图 在学习别人做的报表的时候,我有看到如下图所示的效果。 我个人觉得这个趋势图比较有意思,于是就研究了一下是如何画出来的。 经研究发现,这个就是用SVG画出来的。 前面介绍SVG的时候提到过,SVG可以用来画一些自定义的图表。 这里我们主要就学习如何用SVG画折线图。 图中所示的折线图的含义是:每类电影票房趋势的变化(by year)。 即:X轴——year,Y轴——每年该类电影票房总值。由于是缩略图,我们肯定不能按照真实的year和票房来展现X、Y轴。 而需要对X、Y轴进行一些处理,让缩略图显示得更加美观。 阅读详情

前言

写码,看书,思考,这周挺多感触的。

因为手上的项目前端用了Angular,所以UI改版的时候考虑了Angular-material,学校的项目前端用了React,所以也想接入ant-design mobile的那套设计规范,这两个都是业界非常不错的UI库,看他们的文档都会让你觉得能使手上的web应用瞬间高大上起来。

其实不然,即便是开源,也不是拿来就用那么美好,那晚尝试接入ant-design的轮播组件,出现下一张图片的一部分盖在上一张图片上情况,而官方文档写得极少,于是去看源码,发现了一些bug,自己用一些比较hack的方法纠正后发现组件体积大概有30k(压缩后),于是自己实现了一个light-swiper,未压缩只有4k,兼容性够用。

这件事让我清醒了一些,过去自己喜欢并且推崇的那些库,其实自己并没有深入地去了解别人的实现,万一某天这些通用性的库不能满足你的个性化需求,你该何去何从。

工具固然重要,可只有不依赖工具,工具才是真正为你所用。


不多说了,下面简单说说怎么用D3.js画一个趋势缩略图,先上效果图(截于Google Trend):

svg趋势图

D3.js与SVG

对SVG比较熟的老司机肯定一眼看穿这个图是怎么组成的:

svg趋势图源码

就是两个SVG的path(不了解的可以先了解一下),第一个用于绘制折线,第二个用于绘制区域。一开始我想一个path用于绘制区域就能达到这种效果了吧,后来效果不佳,还是采取了Google的实践,后面会提到。


标题还提到了D3.js,简单介绍一下。

D3.js是一个用于数据可视化的js库,以数据驱动的方式去操作SVG,或原生的DOM,数据驱动的方式很有意思,下面看代码会有感触。

d3.js官网

源码

很简单的一个东西,直接放码过来好了:

<!DOCTYPE html>
<html>
<head>
<!-- 引入d3库 -->
<script src="https://d3js.org/d3.v4.min.js"></script>
</head>
<body>
  <svg width="100" height="32"></svg>
  <script>
    var data = [100,321,50,100,80];
    var svg_height = 32;
    var svg_width = 100;
    var d = svg_width / data.length;
    //比例尺
    var scale = d3.scaleLinear().domain([0, d3.max(data)]).range([0, svg_height]);
    //折线生成函数
    var line_generator = function(x,i) {
      var offset = -1;
      var line_data = data.map( function(y) {
        offset ++;
        return { y: svg_height - scale(y), x: offset * d };
      } );
      var lineFunction = d3.line().x(function(d){return d.x;}).y(function(d){return d.y;});
      return lineFunction(line_data);
    };
    //区域生成函数
    var area_generator = function(x,i) {
      var offset = -1;
      var area_data = data.map( function(y) {
        offset ++;
        return [offset * d, svg_height - scale(y)];
      } );
      var area = d3.area().y0(svg_height);
      return area(area_data);
    };
    setTimeout( function() {
      // line
      d3.select('svg')
        .data(data)         //数据驱动:根据data的长度去生成对应的path
        .append('path')
          .attr('stroke', 'rgb(66, 132, 243)')
          .attr('stroke-width', 2)
          .attr('fill', 'none')
          .attr('d', line_generator);
      // area
      d3.select('svg')
        .data(data)
        .append('path')
          .attr('stroke', 'none')
          .attr('fill', 'rgba(66, 132, 243, 0.2)')
          .attr('d', area_generator);
      }, 300 );
  </script>  
</body>
</html>

只用区域实现的效果:

svg趋势图

对边界进行调整后:

svg趋势图

第二个图因为做了调整,随意后面的比例有所变化,在产品中还是采取折线加区域的实现方式。下面是只用区域的代码。

<!DOCTYPE html>
<html>
<head>
<!-- 引入d3库 -->
<script src="https://d3js.org/d3.v4.min.js"></script>
</head>
<body>
  <svg width="100" height="32"></svg>
  <script>
    var data = [100,321,50,100,80];
    var svg_height = 32;
    var svg_width = 100;
    var d = svg_width / data.length;
    //比例尺
    var scale = d3.scaleLinear().domain([0, d3.max(data)]).range([0, svg_height]);
    //区域生成函数
    var area_generator = function(x,i) {
      var offset = -1;
      var area_data = data.map( function(y) {
        offset ++;
        //去除左右stroke
        if( offset == 0 ) return [-5, svg_height - scale(y)];
        if( offset == data.length - 1 ) return [offset * d + 30, svg_height - scale(y)];
        return [offset * d, svg_height - scale(y)];
      } );
      //去除下stroke
      var area = d3.area().y0(svg_height+10);
      return area(area_data);
    };
    setTimeout( function() {
      // area
      d3.select('svg')
        .data(data)
        .append('path')
          .attr('stroke', 'rgb(66, 132, 243)')
          .attr('fill', 'rgba(66, 132, 243, 0.2)')
          .attr('d', area_generator);
      }, 300 );
  </script>  
</body>
</html>

END

趋势图的实现比较简单,用D3.js有点杀鸡用牛刀的感觉,而且要引入D3.js(76.8k大小),不过D3.js确实好玩:

  1. 基于数据去操作DOM
  2. 提供了许多图形(SVG)生成函数
  3. 想象空间比较大
  4. 待探索…

另一个D3.js的实践

站点24小时PV图:

24小时网站PV图

服务端图表渲染新思路:JSON直接生成SVG/PNG,无需浏览器 数据可视化是报表、监控和文档自动化中的关键环节,而服务端高效产出图表图片一直是工程实践的难点。传统方案依赖前端图表库与浏览器截图,往往带来资源占用高、结果不稳定等问题。基于JSON配置的声明式渲染模式,将图表结构抽象为标准化数据,由渲染器直接输出SVG或PNG,实现了确定性、可复现、无浏览器的图形生成。该方案具备轻量部署、批量出图快、适合CI/CD集成等优势,为定时报表、监控告警配图、批量可视化等场景提供了稳定高效的解决路径。SlickFast正是这一思路的代表工具,通过配置契约分离数据与样式,让服务端出图 阅读详情

相关推荐

基于d3js的simulation力导图canvas实现的带缩略图的关系图谱案例

基于d3.js的simulation力导图,canvas实现的带缩略图的关系图谱案例

react+echarts实现变化趋势缩略图

本文介绍了如何使用React和ECharts实现一个简洁的缩略图折线图组件。通过隐藏坐标轴、刻度线、标签等非核心元素,仅保留折线图的基本线条和填充区域,从而创建一个紧凑的数据可视化展示。组件采用响应式设计,能够自动适应窗口大小变化,并提供了TypeScript接口定义确保类型安全。实现过程中注册了必要的ECharts模块,配置了极简的图表选项,并通过useEffect和useRef管理ECharts实例的生命周期。该组件适合作为数据概览嵌在页面中,既节省空间又能直观展示数据趋势。

vh_YUNYANGYUMO的博客 9859

svg绘制折线图

采用svg,js实现折线图的绘制

Echarts的简单使用与缩略图展示

Echarts的简单使用与缩略图展示

xxuxioxx的博客 1793

CTF逆向实战:如何快速识别RC4、TEA和Base64的魔改变种?

本文针对CTF逆向比赛中常见的加密算法魔改问题,详细讲解了如何快速识别和破解RC4、TEA和Base64的变种。通过分析算法核心特征、常见魔改手法,并结合动态调试与脚本编写等实战技巧,帮助逆向分析人员有效应对算法混淆,提升解题效率。

agile9scrum的博客 783

汇川EASY521 PLC实战指南:从硬件选型到程序架构与故障排查

可编程逻辑控制器(PLC)是工业自动化系统的核心大脑,其工作原理基于循环扫描机制,持续读取输入、执行用户程序并更新输出。这种确定性控制方式,使其在逻辑控制、顺序控制和运动控制中具有不可替代的技术价值,广泛应用于机械设备、生产线和过程控制等场景。对于汇川EASY521这类紧凑型高性能PLC,其核心优势在于集成了运动控制与丰富通讯接口,为中小型设备提供了高性价比的一站式解决方案。在实际应用中,工程师常需处理如“汇川sv660n”伺服驱动器的集成调试,或利用“hslcommunication”等开源库实现C#上位

weixin_42525264的博客 735

SVG 绘制基本图像

svg http://www.ruanyifeng.com/blog/2018/08/svg.html 1、svg 插入界面 方法一:直接以svg标签插入界面中 方法二:以外部文件的形式插入embed iframe 标签中 方法三:以 css 的背景图片插入界面中 2、svg标签使用 基本图形 &amp;lt;svg width='100%' height='100%' viewBox=&quot;50 50 50...

MichaelAn的博客 5232

ZedBoard+Vivado(二)——PS + PL实现流水灯

硬件:Zedboard 软件:Vivado2018.2 + Win10 本文参考了http://blog.chinaaet.com/cuter521/p/35978的设计 1 设计 功能:PS + PL流水灯 语言:C 流程:创建工程-&amp;gt;IP Integrator-&amp;gt;综合、实现、生成Bitstream-&amp;gt;SDK 2 流程 2.1 创建工程 跟上一篇步骤完全相同,这里不用添加源文...

q416524389的博客 3694

html5svg制作折线图,9款基于HTML5/SVG/Canvas的折线图表应用

9款基于HTML5/SVG/Canvas的折线图表应用利用HTML5制作精美而实用的折线图表比较简单,此外我们还可以使用功能强大的SVG和Canvas动画特性,今天我们来分享9款基于HTML5/SVG/Canvas的折线图表应用。2014/05/141、华丽的HTML5图表 可展示实时数据HTML5在图表应用中也十分广泛,比起以前的网页图表,HTML5图表制作更便捷,功能更强大。这款HTML5图表...

weixin_42132056的博客 1204

从网格划分到端口接地:一份给ADS新手的Momentum RF仿真避坑实操指南

本文为ADS新手提供Momentum RF仿真的实用指南,涵盖网格划分、端口接地、特殊结构处理等关键设置技巧。通过30-50 cells/λ原则、1/10波长限制等黄金法则,帮助用户平衡仿真精度与效率,避免常见错误,提升电磁仿真结果的准确性。

weixin_33692284的博客 505

【WRF工具】WRF Domain Wizard第一期:软件下载及安装

【WRF工具介绍】WRF Domain Wizard-确定模拟区域

WW、forever的博客 2918

D3.js SVG绘图实践:波浪动画

效果图TALK IS CHEAP源码就50多行,比较好看懂。<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>svg动画</title> <script src="https://d3js.org/d3.v4.min.js"></script> </head> <body> <svg i

沉淀 8408

YOLO11涨点优化:损失函数优化 | 引入MPDIoU,利用边界框左上角和右下角距离,彻底解决重叠框匹配失效问题

【摘要】针对目标检测中重叠框匹配失效问题,本文提出基于MPDIoU损失函数的解决方案。MPDIoU通过同时约束边界框的左上角和右下角两点距离,有效解决了传统IoU损失在重叠场景下的优化歧义问题。文章首先分析YOLO系列在密集目标检测中的性能瓶颈,指出GIoU/CIoU等现有方法无法区分相同IoU值但偏移方向不同的预测框。随后详细解析MPDIoU的数学原理及其相对于主流损失函数的优势,证明两点距离约束能提供唯一优化方向。最后给出在YOLO11中实现MPDIoU的具体方案,包括核心代码修改点和架构适配建议。实验

2601_95807009的博客 172

D3.js绘制实时映射的缩略图

在做可视化的很多时候,我们需要在主图的一角设置一个缩略图来掌握全局情况。本次将使用力导向图作为例子,完成缩略图的实现。 绘制的原理就是依靠主图的数据再画一个图出来,无需再次计算,只改变图形形态。 最终效果 主图节点拖动,缩略图跟着变化。http://en.jsrun.net/UyiKp/show 代码解析 数据 依然使用之前例子的力导向图...

weixin_33843409的博客 424

29、网络支持技术:CDN、覆盖网络与无标度网络解析

本文详细解析了CDN路由方式与性能指标,探讨了覆盖网络与无标度网络的特性及其在云计算和现代网络中的应用。文章分析了CDN的关键技术与挑战,介绍了覆盖网络与小世界网络的基本原理,并深入讨论了无标度网络的构建算法、性能优化策略以及在多个领域的应用案例。最后,文章展望了未来网络技术发展趋势与无标度网络的结合潜力。

night的博客 88

AI在生物学领域的应用:基因序列分析和人工智能生物学

好的,非常感谢您提供的这个精彩的主题和详细的要求。我会全力以赴,遵循您的要求写一篇内容丰富、结构清晰、论述深入的专业技术文章。现在,就让我们开始这篇关于"AI在生物学领域的应用:基因序列分析和人工智能生物学"的博客文章吧! 1. 背景介绍 1.1 生物信息学的兴起

AI天才研究院 1413

基于svg mask实现的tab切换效果

效果第一次看到这个效果是在阿里妈妈MUX的博客:UI动效—细微交互,极致体验,里面搜集的一些微交互都让人眼前一亮,恰好自己最近要做一个按钮组,就参考了里面Sergey Valiukh的一个设计。源码和上两篇博客一样,相对简单,为了节省你的阅读时间,直接上源码: 上两篇博客: D3.js SVG绘图实践:趋势缩略图 D3.js SVG绘图实践:波浪动画 <!DOCTYPE html>

沉淀 1514

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深度剖析flint-oQ3e量化原理:数据驱动混合精度与3/6/8-bit按层敏感度分配的底层逻辑

flint-oQ3e 是面向 Apple Silicon 的 **Flint 40B MoE 大模型混合精度量化版本**:它用 oMLX 的 oQ3e 方案,按"层敏感度"把不同权重分别压到 3/6/8 bit,把 79.6 GB 的 bf16 模型压缩到 18.5 GB(约 3.71 bpw),让 24–32 GB 内存的 Mac 也能跑这款每 token 激活约 2.5B 参数的推理模型。本文

gitblog_01002的博客 661

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

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

PlantUML Editor终极指南:免费在线UML绘图工具快速上手教程

你是否曾为绘制复杂的UML图表而烦恼?PlantUML Editor是一款基于Vue.js构建的开源在线编辑器,专为快速创建和管理UML图表设计。作为一款强大的在线UML绘图工具,它让开发者能够通过简单的文本描述生成专业的UML图表,彻底告别传统拖拽式绘图的繁琐。本文将带你从零开始,全面掌握这款可视化UML设计神器的使用技巧。 ## 项目价值主张:为什么选择这款免费在线UML工具? Plant

gitblog_00757的博客 547

计算机控制技术及应用

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

免费在线UML绘图工具终极指南:5分钟掌握PlantUML Editor

还在为绘制复杂的UML图表而烦恼吗?PlantUML Editor是一款革命性的**免费在线UML绘图工具**,通过简单的文本描述快速生成专业级UML图表,彻底告别传统拖拽式绘图的繁琐操作。这款**代码驱动图表生成工具**支持所有主流UML图表类型,包括类图、时序图、用例图、活动图、状态图和组件图,让软件设计和团队沟通变得更加高效。 ## 直观界面布局:三区协同工作流 PlantUML Edi

gitblog_00125的博客 511

深度掌握SVG路径path的贝塞尔曲线指令

by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=4197 一、数字、公式、函数、变量,哦,NO! 又又一次说起贝塞尔曲线(英语:Bézier curve,维基百科详尽中文释义戳这里),我最近在尝试实现复杂的矢量图形动画,发现对贝塞尔曲线的理解馒头那么厚,是

SalmonellaVaccine的专栏 1826

bpmn-js自定义渲染器开发与SVG优化实践

SVG作为矢量图形标准在业务流程可视化领域具有独特优势,其基于XML的语法结构允许开发者实现无限缩放不失真的图形渲染。在bpmn-js等BPMN工具中,通过继承BaseRenderer核心类可以完全控制流程图元素的绘制逻辑,这为打造高颜值业务流程视图提供了技术基础。现代前端工程中,结合原生SVG API与Snap.svg等轻量库能显著提升渲染性能,实测显示在100+节点场景下较D3.js有30%的性能提升。这类技术在客服工单系统、企业审批流程等需要展示复杂业务逻辑的场景中尤为重要,通过分级渲染策略和虚拟滚动

weixin_31130435的博客 176

AI Agent 结合 SVG 手放坐标:实现可控图表生成与自动化流水线

在 AI Agent 的工程化落地中,如何稳定输出结构清晰的图表是一大挑战。Agent Skill 作为一种预置任务流程与模板机制,为智能体提供了领域操作手册,使其能复用标准步骤完成任务。SVG 作为矢量格式,具备可编辑、可嵌入、可缩放且与渲染引擎解耦等特性,成为图表生成的均衡选择。通过手放坐标方式,模型显式计算每个元素的 x、y、宽高与路径,能显著提升布局的确定性和可校验性,避免 HTML 渲染漂移或 Mermaid 样式受限等问题。这类技能以 Agent Skill 形态分发,不依赖独立模型,显存需求低

weixin_33853794的博客 320

基于Python与Web技术的基因数据交互式可视化实战

数据可视化是将抽象数据转化为直观图形的关键技术,其核心原理在于通过图形编码将数据属性映射为视觉元素,从而揭示数据中的模式与关联。在生物信息学领域,基因数据可视化对于理解复杂的序列信息和结构注释至关重要。通过结合Python强大的数据处理能力与现代Web前端技术,可以构建轻量级、可交互的可视化解决方案,有效解决传统静态图表在**基因序列分析**中灵活性不足的问题。这种技术方案能够将FASTA、GFF等格式的基因数据动态渲染为序列视图和基因结构视图,并支持鼠标悬停、缩放等交互操作,极大地提升了生物信息学研究和数

weixin_34195142的博客 315

如何快速使用PlantUML在线编辑器:文本绘图神器完整指南

还在为绘制复杂的UML图表而烦恼吗?PlantUML在线编辑器让你通过简单的文本描述就能生成专业级图表!这款基于Vue.js开发的免费开源工具彻底改变了技术文档的可视化方式,让UML绘制变得像写代码一样简单高效。 ## 为什么选择PlantUML在线编辑器? **传统绘图工具的问题**: - 需要安装复杂软件 - 手动拖拽元素耗时耗力 - 图表修改困难 - 版本控制不便 **PlantUML

gitblog_00605的博客 402

2025全新体验:Trilium Notes与Excalidraw可视化协作完全指南

你是否还在为思维导图与文字笔记割裂而烦恼?是否经历过灵感迸发时却受限于线性文本记录的尴尬?本文将带你探索Trilium Notes与Excalidraw深度集成的革命性工作流,只需5分钟即可掌握可视化思考的全新方式,让你的知识管理效率提升300%。读完本文,你将获得:在单一界面完成从头脑风暴到知识体系构建的全流程、掌握双向链接的可视化知识图谱构建方法、学会用SVG矢量图实现笔记内容的动态展示。 ...

gitblog_00432的博客 988
上一篇: ReactJS修炼之路(四):组件的性能优化及开发思路
下一篇: D3.js SVG绘图实践:波浪动画
Sheldon_Law
博客等级 码龄11年 44粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值